Shell指令碼程式設計(二)
阿新 • • 發佈:2018-12-08
Shell替換
shell變數替換
如果表示式中包含特殊字元,Shell 將會進行替換。例如,在雙引號中使用變數就是一種替換,轉義字元也是一種替換。
#!/bin/bash
a=10
echo -e "Value of a is $a \n"
執行結果:
Value of a is 10
這裡 -e 表示對轉義字元進行替換。如果不使用 -e 選項,將會原樣輸出:
Value of a is 10\n
可以使用 echo 命令的 -E 選項禁止轉義,預設也是不轉義的;使用 -n 選項可以禁止插入換行符。
命令替換
命令替換是指Shell可以先執行命令,將輸出結果暫時儲存,在適當的地方輸出。
命令替換的語法:
`command`
下面的例子中,將命令執行結果儲存在變數中:
#!/bin/bash
DATE=`date`
echo "Date is $DATE"
USERS=`who | wc -l`
echo "Logged in user are $USERS"
變數替換
變數替換可以根據變數的狀態(是否為空、是否定義等)來改變它的值。
可以使用的變數替換形式:
形式 | 說明 |
---|---|
${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 的值。 |
shell運算子
算術運算子
expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
假設a=20,b=10。
運算子 | 說明 | 舉例 |
---|---|---|
+ | 加法 | `expr $a + $b` 結果為 30。 |
- | 減法 | `expr $a - $b` 結果為 10。 |
* | 乘法 | `expr $a \* $b` 結果為 200。 |
/ | 除法 | `expr $b / $a` 結果為 2。 |
% | 取餘 | `expr $b % $a` 結果為 0。 |
= | 賦值 | a=$b 將把變數 b 的值賦給 a。 |
注意:條件表示式要放在方括號之間,並且要有空格,例如 2+2 是不對的,必須寫成 2 + 2。乘號(*)前邊必須加反斜槓()才能實現乘法運算。
關係運算符
運算子 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] |
-ne | 檢測兩個數是否相等,不相等返回 true。 | [ $a -ne $b ] |
-gt | 檢測左邊的數是否大於右邊的,如果是,則返回 true。 | [ $a -gt $b ] |
-lt | 檢測左邊的數是否小於右邊的,如果是,則返回 true。 | [ $a -lt $b ] |
-ge | 檢測左邊的數是否大等於右邊的,如果是,則返回 true。 | [ $a -ge $b ] |
-le | 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 | [ $a -le $b ] |
布林運算子
a=10;
b=20;
運算子 | 說明 | 舉例 |
---|---|---|
! | 非運算,表示式為 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。 |
字串運算子
a="abc"
b="efg"
運算子 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字串是否相等,相等返回 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。 |
檔案測試運算子
檔案測試運算子用於檢測 Unix 檔案的各種屬性。
變數 file 表示檔案“/var/www/tutorialspoint/unix/test.sh”,它的大小為100位元組,具有 rwx 許可權。
操作符 | 說明 | 舉例 |
---|---|---|
-b file | 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
-c file | 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 | [ -c $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。 |
shell字串操作
常見的shell字串操作如下:
shell陣列
bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。類似與C語言,陣列元素的下標由0開始編號。獲取陣列中的元素要利用下標,下標可以是整數或算術表示式,其值應大於或等於0。
定義陣列
在Shell中,用括號來表示陣列,陣列元素用“空格”符號分割開。定義陣列的一般形式為:
array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
還可以單獨定義陣列的各個分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用連續的下標,而且下標的範圍沒有限制。
讀取陣列
讀取陣列元素值的一般格式是:
${array_name[index]}
使用@ 或 * 可以獲取陣列中的所有元素,例如:
${array_name[*]}
${array_name[@]}
獲取陣列長度的方法與獲取字串長度的方法相同,例如:
# 取得陣列元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得陣列單個元素的長度
lengthn=${#array_name[n]}