建立一個文件,以.sh做爲擴展名(注意Linux是沒有擴展名這個概念的,能夠隨意取.s或者.甚至能夠沒有擴展名),這裏取.sh是爲了咱們好識別這是個Shell腳本。bash
這裏我在你本身想要存放文件的目錄下建立一個Shell腳本,命名爲first.shless
在默認的vi編輯器中,第一行輸入以下代碼:編輯器
第一行開頭"#!"是一個約定的標記,特別重要,它告訴系統這個腳本須要什麼解釋器來執行,即哪種Shell函數
第二句 echo命令後面加了字符串,表示在打印後面的字符串。再保存,退出。工具
怎麼執行咱們剛建立好的腳本呢?oop
chmod +x ./first.sh #使腳本具備執行權限
./first.sh #執行腳本,注意不能有空格
或者直接:測試
sh first.sh #注意在當前路徑執行,不然寫絕對路徑
在Shell腳本中變量名的幾個要求:spa
特別注意:變量名和等號之間不能有空格命令行
//正確: myName="Jim" //錯誤: myName = "Jim"
在定義變量的時候,直接能夠左邊變量名,右邊爲值,中間用等號鏈接,在強調一遍(等號兩邊不能有空格)unix
定義變量舉例:
stu_name="Jack" stu_Num=12
咱們怎麼使用變量呢?在使用的時候,咱們用$變量名,就能夠輸出對應得值
name="Jim" echo $name
可是咱們最好在變量名先後加{},形式爲:${變量名}
name="Jim" echo ${name}
這樣有幾個好處,一是便於咱們很直觀的看出這是變量,還有一種狀況就是看代碼:
language="Java" echo "I like $languageScript"
結果會輸出: I like JavaScript 嗎?會嗎?系統很能智能的識別到language是變量嗎?
你能夠試試就知道了,不過我敢保證,下面這樣確定能夠:
language="Java" echo "I like ${language}Script"
結果:
對吧,這樣系統能夠很好的識別到大括號括起來的是變量。
language="Java" language="Shell" echo "I like ${language}Script"
readonly 變量名
這樣變量就是隻讀,不能修改了
unset 變量名
刪除後,結果輸出就爲空:
變量 | 含義 |
---|---|
$0 | 當前腳本的文件名 |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的全部參數。 |
$@ | 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前 Shell 進程 ID。對於 Shell 腳本,就是這些腳本所在的進程 ID。 |
例如:查看點Shell進程的ID
echo $$
運行腳本時,傳遞給腳本的參數爲命令行參數,例若有如下腳本:
#!/bin/bash echo "當前Shell進程的ID爲:$$" echo "文件名稱:$0" echo "文件的第一個參數:$1" echo "文件的第二個1參數:$2" echo "傳遞給腳本的參數個數:$#" echo "傳遞給腳本或函數的全部參數:$*"
運行結果:
#!/bin/bash echo "當前Shell進程的ID爲:$$" echo "文件名稱:$0" echo "文件的第一個參數:$1" echo "文件的第二個1參數:$2" echo "傳遞給腳本的參數個數:$#" echo "傳遞給腳本或函數的全部參數:$*" echo "\$*=" $* echo "\"\$*\"=" "$*" echo "\$@=" $@ echo "\"\$@\"=" "$@" echo "print each param from \$*" for var in $* do echo "$var" done echo "print each param from \$@" for var in $@ do echo "$var" done echo "print each param from \"\$*\"" for var in "$*" do echo "$var" done echo "print each param from \"\$@\"" for var in "$@" do echo "$var" done
執行結果:
比較下面兩條語句輸出的不一樣點:
a=10 //此處帶參數-e eco -e "Value od a is ${a} \n" //此處不帶參數 echo "Value of a is ${a} \n"
結果比較:
這裏帶參數 -e表示對轉義字符進行替換,"\n"表明換行,
相應的其餘轉義字符以下:
轉義字符 | 含義 |
---|---|
\|反斜槓 | |
\a | 警報,響鈴 |
\b |
退格(刪除鍵) |
\f | 換頁(FF),將當前位置移到下頁開頭 |
\n | 換行 |
\r | 回車 |
\t | 水平製表符(tab 鍵) |
\v | 垂直製表符 |
命令替換是指Shell能夠先執行命令,將輸出結果暫時保存,在適當的地方輸出。
命令替換的語法:command注意是反引號,就是esc鍵下面這個位置
例如:
DATE=`date` echo "Date is ${DATE}"
這裏意思是先執行date這個命令。結果爲今天的時間,而後將時間賦值給變量DATE,最後輸出變量的值。
UP=·date,uptime· echo "Uptime is ${UP}"
結果:
變量替換就是能夠根據變量的狀態(是否爲空 、是否認義等)來改變它的值
咱們先來個例子感覺下:
echo your name is ${name:-"your name is not set"}
:-表明若是變量爲空或者已經被刪除,就輸出後面的值,像這樣的例子以下表所示:
形式 | 說明 |
---|---|
${var} | 變量原本的值 |
${var:-word} | 若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值 |
${var:=word} | 若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word。 |
${var:?message} | 若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標 準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。若此替換出如今 Shell 腳本中,那麼腳本將中止運行。 |
${var:+word} | 若是變量 var 被定義,那麼返回 word,但不改變 var 的值。 |
Bash 支持不少運算符,包括算數運算符、關係運算符、布爾運算符、字符串運算符和文件測試運算符。
原生 bash 不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,expr 最經常使用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操做。
不信?咱們先來看這是什麼結果:
echo 2+3
會輸出5嗎? 不會!!!沒有Python那麼高端,
那麼能夠利用計算器expr來計算:
expr 2 + 3 #注意這裏2 + 2 空格,等號兩邊必定要有空格
那麼,咱們能夠用剛纔學的命令替換,來進行計算
var=·expr 2 - 5· echo ${var}
計算器相關的用法能夠用 man expr命令來查看
運算符 | 說明 | 舉例 |
---|---|---|
+ | 加法 | `expr $a + $b` 結果爲?30。 |
- | 減法 | `expr $a - $b` 結果爲 10。 |
* | 乘法 | `expr $a \* $b` 結果爲 ?200。 |
/ | 除法 | `expr $b / $a` 結果爲?2。 |
% | 取餘 | `expr $b % $a` 結果爲?0。 |
= | 賦值 | a=$b 將把變量 b 的值賦給 a。 |
== | 相等。用於比較兩個數字,相同則返回 true。 | [ $a == $b ] 返回?false。 |
!= | 不相等。用於比較兩個數字,不相同則返回 true。 | [ $a != $b ] 返回 true。 |
注意:條件表達式要放在方括號之間,而且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。
關係運算符只支持數字,不支持字符串,除非字符串的值是數字。
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回?true。 |
-ne | 檢測兩個數是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,若是是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數是否小於右邊的,若是是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數是否大等於右邊的,若是是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,若是是,則返回 true。 | [ $a -le $b ] 返回 true。 |
例如:
#!/bin/sh a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a is equal to b" else echo "$a -eq $b: a is not equal to b" fi if [ $a -ne $b ] then echo "$a -ne $b: a is not equal to b" else echo "$a -ne $b : a is equal to b" fi if [ $a -gt $b ] then echo "$a -gt $b: a is greater than b" else echo "$a -gt $b: a is not greater than b" fi if [ $a -lt $b ] then echo "$a -lt $b: a is less than b" else echo "$a -lt $b: a is not less than b" fi if [ $a -ge $b ] then echo "$a -ge $b: a is greater or equal to b" else echo "$a -ge $b: a is not greater or equal to b" fi if [ $a -le $b ] then echo "$a -le $b: a is less or equal to b" else echo "$a -le $b: a is not less or equal to b" fi
結果:
10 -eq 20: a is not equal to b 10 -ne 20: a is not equal to b 10 -gt 20: a is not greater than b 10 -lt 20: a is less than b 10 -ge 20: a is not greater or equal to b 10 -le 20: a is less or equal to b
運算符 | 說明 | 舉例 |
---|---|---|
! | 非運算,表達式爲 true 則返回 false,不然返回 true。 | [ ! false ] 返回 true。 |
-o | 或運算,有一個表達式爲 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回?true。 |
-a | 與運算,兩個表達式都爲 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回?false。 |
#!/bin/sh a=10 b=20 if [ $a != $b ] then echo "$a != $b : a is not equal to b" else echo "$a != $b: a is equal to b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a -lt 100 -a $b -gt 15 : returns true" else echo "$a -lt 100 -a $b -gt 15 : returns false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi
結果:
10 != 20 : a is not equal to b 10 -lt 100 -a 20 -gt 15 : returns true 10 -lt 100 -o 20 -gt 100 : returns true 10 -lt 5 -o 20 -gt 100 : returns false
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 檢測兩個字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回?true。 |
-z | 檢測字符串長度是否爲0,爲0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字符串長度是否爲0,不爲0返回 true。 | [ -z $a ] 返回 true。 |
str | 檢測字符串是否爲空,不爲空返回 true。 | [ $a ] 返回?true。 |
例如:
#!/bin/sh a="abc" b="efg" if [ $a = $b ] then echo "$a = $b : a is equal to b" else echo "$a = $b: a is not equal to b" fi if [ $a != $b ] then echo "$a != $b : a is not equal to b" else echo "$a != $b: a is equal to b" fi if [ -z $a ] then echo "-z $a : string length is zero" else echo "-z $a : string length is not zero" fi if [ -n $a ] then echo "-n $a : string length is not zero" else echo "-n $a : string length is zero" fi if [ $a ] then echo "$a : string is not empty" else echo "$a : string is empty" fi
結果:
abc = efg: a is not equal to b abc != efg : a is not equal to b -z abc : string length is not zero -n abc : string length is not zero abc : string is not empty
文件測試運算符用於檢測 Unix 文件的各類屬性。
例如,變量 file 表示文件「/var/www/tutorialspoint/unix/test.sh」,它的大小爲100字節,具備 rwx 權限。下面的代碼,將檢測該文件的各類屬性:
#!/bin/sh file="/var/www/tutorialspoint/unix/test.sh" if [ -r $file ] then echo "File has read access" else echo "File does not have read access" fi if [ -w $file ] then echo "File has write permission" else echo "File does not have write permission" fi if [ -x $file ] then echo "File has execute permission" else echo "File does not have execute permission" fi if [ -f $file ] then echo "File is an ordinary file" else echo "This is sepcial file" fi if [ -d $file ] then echo "File is a directory" else echo "This is not a directory" fi if [ -s $file ] then echo "File size is zero" else echo "File size is not zero" fi if [ -e $file ] then echo "File exists" else echo "File does not exist" fi
結果:
File has read access File has write permission File has execute permission File is an ordinary file This is not a directory File size is zero File exists
文件測試運算符列表:
操做符 | 說明 | 舉例 |
---|---|---|
-b file | 檢測文件是不是塊設備文件,若是是,則返回 true。 | [ -b $file ] 返回 false。 |
-c file | 檢測文件是不是字符設備文件,若是是,則返回 true。 | [ -b $file ] 返回?false。 |
-d file | 檢測文件是不是目錄,若是是,則返回 true。 | [ -d $file ] 返回 false。 |
-f file | 檢測文件是不是普通文件(既不是目錄,也不是設備文件),若是是,則返回 true。 | [ -f $file ] 返回?true。 |
-g file | 檢測文件是否設置了 SGID 位,若是是,則返回 true。 | [ -g $file ] 返回?false。 |
-k file | 檢測文件是否設置了粘着位(Sticky Bit),若是是,則返回 true。 | [ -k $file ] 返回?false。 |
-p file | 檢測文件是不是具名管道,若是是,則返回 true。 | [ -p $file ] 返回?false。 |
-u file | 檢測文件是否設置了 SUID 位,若是是,則返回 true。 | [ -u $file ] 返回?false。 |
-r file | 檢測文件是否可讀,若是是,則返回 true。 | [ -r $file ] 返回?true。 |
-w file | 檢測文件是否可寫,若是是,則返回 true。 | [ -w $file ] 返回?true。 |
-x file | 檢測文件是否可執行,若是是,則返回 true。 | [ -x $file ] 返回?true。 |
-s file | 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。 | [ -s $file ] 返回?true。 |
-e file | 檢測文件(包括目錄)是否存在,若是是,則返回 true。 | [ -e $file ] 返回?true。 |
str="Welcome To My World" echo ${#str}
str="Welcome To My World" echo ${str:1:4}
str="runoob is a great company" echo `expr index "$str" is`
查找"T"或"o"的位置
grep -q "Joe" t.txt && echo "OK" || echo "Error"
tar -zxvf hadoop-2.6.0.tar.gz
tar -zcvf hadoop-2.6.0.tar.gz hadoop-2.6.0