首先強調一下,Bourne Shell資料類型的概念極簡單:一切變量的值,都是字元串。是以,也可以認為,Bourne Shell隻有一種基本資料類型,那就是字元串。
由于資料類型太簡單,是以腳本中若要進行各種數學運算,隻能借助其他程式(例如,expr程式)來完成。其他程式計算出的結果,在腳本中仍然儲存為一個字元串。
唯一例外的是數組,他是一組字元串的集合。
腳本第一行固定為如下内容
#!/bin/sh
他表示這是一個解釋器檔案,由程式/bin/sh來解釋執行。當然,若實際環境中sh程式不在這個路徑,則調整一下即可。
好了,下面開始進入正文。
0. 變量指派及引用
給變量指派
VAR_NAME=expression
例如:
a=1
a=hello
a="Hello world!" #值為多個單詞時,需要用引号括一下
引用變量的值
${VAR_NAME} 或者 $VAR_NAME
1. 指令行參數
以如下指令行為例
xxx.sh a b c
$0 表示指令行中最左邊的這部分,即用相對路徑或絕對路徑表示的腳本檔案的路徑。
實際執行時,這裡是什麼,就是什麼。他就是原原本本的shell腳本的路徑。
$# 表示參數的個數,不包括$0本身。本例中,$#為3,即3個參數:a b c。
$1 $2 $3 ......表示具體的參數。這裡他們分别對應a b c
最後,對于函數的參數,$#與$1 $2 $3 ......,含義完全同上。
同時,對于函數來說,$0的值并不是函數名,而是與腳本執行指令行參數中的$0一緻。
2. 儲存指令執行的标準輸出到變量中
a=`/path/to/program [params ...]`
注意,不管指令的輸出中是否包含分隔開的單詞,整個結果都做為一個字元串儲存到了變量中。
這個對于儲存函數執行的标準輸出也一樣适用。文法也一樣。
a=`function [params ...]`
3. 數組相關
注意,所有相關的值,還是和變量的值類型一樣,都是字元串。
建立數組 a=(1 2 3 4 5)
數組元素個數 ${#a[@]} #值為5
引用元素 ${a[i]} #注意,數組下标i從0開始
元素指派 a[i]=100
引用整個數組的内容 ${a[*]} 或者 ${a[@]} #值為1 2 3 4 5
最後注意一下,這裡數組a的指派比較規範。實際情況下,括号内的内容,可以是一組用分隔符(可以是空格,換行符)隔開的單詞(例如 ls 指令的執行結果)。
指派後,每個單詞就是數組的一個元素,幹幹淨淨的,不包含分隔符本身。如果兩個單詞之間有多個分隔符,效果還是等于一個分隔符。
4. 分支文法
(i)if語句
if [ expression ]; then
...
elif [ expression ]; then
...
else
...
fi
(ii)for循環
item_list="1 2 3 4 5" 或者引用前面的數組生成條目清單 item_list=${a[@]}
for i in ${item_list};
do
echo $i
done
5. sed引用shell變量
示例如下。唯一要注意的是,要使用雙引号,不能使用單引号。
sed "s/something/${var_name}/g" a.txt
6. awk引用shell變量
示例如下。
echo 1 2 3 | awk '{ if ($3=="'$var_name1'") print "'$var_name2'"}'