天天看點

Bourne Shell程式設計雜記

首先強調一下,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'"}'