1. 程式人生 > >Shell指令碼程式設計(二)

Shell指令碼程式設計(二)

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]}

參考:http://c.biancheng.net/cpp/view/1499.html