Shell(Bash)位置引數變數用法詳解

2020-07-16 10:04:34
在 Linux 的命令列中,當一條命令或指令碼執行時,後面可以跟多個引數,我們使用位置引數變數來表示這些引數。

其中,$0 代表命令列本身,$1 代表第 1 個引數,$2 代表第 2 個引數,依次類推。當引數個數超過 10 個時,就要用大括號把這個數位括起來,例如,${10} 代表第 10 個引數,${14} 則代表第 14 個引數。舉個例子:

[[email protected] ~]# ls anaconda-ks.cfg install.log install.log.syslog

如果執行這樣一條命令,則 $0 的值就是 ls 命令本身,$1 的值就是 anaconda-ks.cfg 這個檔案,$2 是 install.log 檔案,$3 是 install.log.syslog 檔案。

在 Shell 中可以識別的位置引數變數如表 1 所示。

表 1 位置引數變數
位置引數變數 作 用
$n n 為數位,$0 代表命令本身,$1?$9 代表第 1?9 個引數,10 以上的引數需要用大括號包含, 如${10}
$* 這個變數代表命令列中所有的引數,把所有的引數看成一個整體
[email protected] 這個變數也代表命令列中所有的引數,不過 [email protected] 把每個引數區別對待
$# 這個變數代表命令列中所有引數的個數

位置引數變數要用於向命令或程式指令碼中傳遞資訊,比如,我們想要寫一個計算器,要告訴程式應該運算哪個字元,這時就需要通過位置引數變數向指令碼中傳遞數值,命令如下:

[[email protected] ~]# cd sh/
[[email protected] sh]# vi count.sh
#!/bin/bash
num1=$1
#給num1變數賦值是第一個引數
num2=$2
#給num2變數賦值是第二個引數
sum=$(($num1 + $num2))
#變數sum的和是num1加num2
echo $sum
#列印變數sum的值

在 Shell 中,數值運算是必須使用特殊格式的(後續章節會做詳細介紹),這裡大家先照著例子操作。 執行一下此指令碼:

[[email protected] sh]# chmod 755 count.sh
#給指令碼檔案賦予執行許可權
[[email protected] sh]#./count.sh 11 22
33
#這個指令碼就會把第一個引數和第二個引數相加

還有幾個位置引數變數是幹什麼的呢?我們再寫一個指令碼來說明一下,如下:

[[email protected] sh]# vi parameter.sh
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有引數的個數
echo 'The parameters is: $*"
#使用$*代表所有的引數
echo 'The parameters is: [email protected]"
#使用[email protected]也代表所有的引數

執行此指令碼:

[[email protected] sh]# chmod 755 parameter.sh
[[email protected] sh]#./parameter.sh 11 22 33
A total of 3 parameters
#因為輸入了三個引數,所以$#顯示的值是3
The parameters is: 11 22 33
#輸出了所有引數
The parameters is: 11 22 33
#也輸出了所有引數

那麼"$*"和"[email protected]"有區別嗎?還是有區別的,$* 會把接收到的所有引數當成一個整體對待,而 [email protected] 則會區別對待接收到的所有引數。還是舉個例子吧:

[rootdlocalhost sh]# vi parameter2.sh
#!/bin/bash
for i in "$*"
#定義for迴圈,in後面有幾個值,for就會迴圈多少次,注意"$*"要用雙引號括起來
#每次回圈都會把in後面的值賦予變數i
#Shell把“$*”中的所有引數看成一個整體,所以這個for迴圈只會迴圈一次
    do
        echo "The parameters is: $i"
        #列印變數$i的值
    done
x=0
#定義變數x的值為0
for y in "[email protected]"
#同樣,in後面有幾個值,for就會迴圈幾次,每次都把值賦予變數y
#因為Shell會把“[email protected]”中的每個引數都看成獨立的,所以“[email protected]”中有幾個引數,就會迴圈幾次
    do
        echo "The parameter$x is: $y"
        #輸出變數y的值
        x=$(( $x +1 ))
        #讓變數x每次回圈都加1 ,是為了輸出時看得更清楚
    done
echo "x is: $x"

在這個指令碼中我們用到了 for 迴圈,關於 for 迴圈,我們在後續章節中還會有詳細介紹。執行一下這個指令碼:

[[email protected] sh]# chmod 755 parameter2.sh
[[email protected] sh]#./parameter2.sh 11 22 33
The parameters is: 11 22 33
#這是第一個for的結果,"$*"被看作一個整體,所以只會迴圈一次
The parameter1 is: 11
The parameter2 is: 22
The parameter3 is: 33
#這是第二個for的結果,“[email protected]”中的每個變數被區別對待,所以會迴圈三次
x is:3
#x的值是 3,證明迴圈了三次