『忘了再學』Shell基礎 — 16、位置引數變數
阿新 • • 發佈:2022-05-23
目錄
1、位置引數變數
2、位置引數變數
3、位置引數變數
位置引數變數的作用主要用於指令碼的傳參。
位置引數變數的名稱和作用都是確定不能改變的,但是該變數的內容是可以更改的,也就是變數的值。
位置引數變數如下:
位置引數變數 | 作用 |
---|---|
$n |
n 為數字,$0 代表命令本身,$1-$9 代表(指令碼命令後的)第一到第九個引數,十以上的引數需要用大括號包含,如${10} 、${15} 。 |
$* |
這個變數代表命令列中所有的引數,$* 把所有的引數看成一個整體。 |
$@ |
這個變數也代表命令列中所有的引數,不過$@ 把每個引數區分對待。 |
$# |
這個變數代表命令列中所有引數的個數。 |
1、位置引數變數$n
$n
:n
為數字,$0
代表命令本身,$1-$9
代表(指令碼命令的)第一到第九個引數,十以上的引數需要用大括號包含,如${10}
、${15}
。(這個是一個典型的向Shell腳本當中傳遞值的方式)
(1)示例:
# 定義一個shell指令碼,簡單的計算器,求兩個數的和。 [root@Lyl tmp]# vim count.sh # 指令碼內容如下: #!/bin/bash # 給num1變數賦值是第一個引數 num1=$1 # 給num2變數賦值是第二個引數 num2=$2 # 變數sum是變數num1加變數num2的(其實上邊的num1和num2的定義可以省略) sum=$(($num1 + $num2)) # 注意:執行count.sh指令碼後的第一個引數會傳遞給$1,第二個引數會傳遞給$2, # 然後$num1和$num2進行求和,再賦值給sum變數。 # 但是Shell中自定義變數的預設型別是字串型別, # 而我們傳入的兩個數字型別的變數值,Shell預設都識別為字串型別。 # 而這個時候我們就需要$(( ))把這個兩個字串型別的數值括起來, # Shell才能知道要進行數值運算,裡邊的引數都是數值(Shell運算子中會詳細講)。 # 而$( )是括系統命令的,然後把該命令執行的結果,賦值給前面的變數,這個我們要注意。 #列印變數sum的值 echo $sum echo $0 # 執行該指令碼 [root@Lyl tmp]# chmod 755 count.sh [root@Lyl tmp]# ./count.sh 22 66 88 ./count.sh
(2)總結:
$1
儲存的是執行Shell命令之後的第一個引數,$2
儲存的是執行Shell命令之後的第二個引數,$0
代表執行指令碼的命令,如上邊的./count.sh
。
- 位置引數變數好處。
其作用就是把執行指令碼命令後輸入的引數,傳入到指令碼中,使指令碼中的變數可以靈活取值。 - 位置引數變數的缺點。
如果是一個普通的Linux使用者,該指令碼並不是自己寫的。當你獲得該指令碼的時候,你是無法知道需要在指令碼後邊是否加引數,或者是加什麼引數,指令碼才能正確執行,是沒有任何提示的。
所以用位置引數變數傳參,並不適合給普通使用者來使用,一般是寫的指令碼自己用的時候,用的比較多。
提示:
位置引數變數也可以給函式中傳參(其實就是自己給自己傳值)。
給普通使用者的指令碼,傳參的方式用
read
,會有提示,比較友好,我們之後說明。
2、位置引數變數$*
和$@
$*
:這個變數代表命令列中所有的引數,$*
把所有的引數看成一個整體。
$@
:這個變數也代表命令列中所有的引數,不過$@
把每個引數區分對待。
(1)用法
我們先寫一個指令碼來展示一下位置引數變數$*
和$@
的用法:
# 定義一個指令碼parameter.sh
[root@Lyl tmp]# vim parameter.sh
# 指令碼內容如下:
#!/bin/bash
# 使用$*代表所有的引數(所有引數整體對待)
echo "The parameters \$* is:$*"
# 使用也代表所有引數(所有引數分開對待)
echo "The parameters \$@ is:$@"
# 執行該指令碼
[root@Lyl tmp]# chmod 755 parameter.sh
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $* is:11 22 33 44
The parameters $@ is:11 22 33 44
我們可以看到位置引數變數$*
和$@
,都把執行指令碼命令後邊帶的引數打印出來了。
(2)區別
位置引數變數$\*
和$@
的區別是,$*
把所有引數當作一個整體,而$@
是先把11賦值給$@
,在把22賦值給$@
,以此類推,是分開的。
我們通過下邊的例子來說明:
# 我們先簡單的來說一下for迴圈
# 簡單的for迴圈例子
for i in 1 2 3 4
do
echo $i
done
# 說明:
# 在in後有幾個數或者說是以空格隔開的變數(因為預設都是字串型別),
# in後有幾個變數,這個for迴圈就迴圈幾次。
# 第一次迴圈,把第一個變數賦值給in前邊的變數i,然後進入迴圈操作。
# 這只是for迴圈的一種形式,知道流程即可,後邊會在詳細說明Bash中的for迴圈。
# do和done就類似於Java中for迴圈的大括號(先這樣理解就可以)。
# 寫一個for迴圈指令碼
[root@Lyl tmp]# vim for.sh
# 指令碼內容如下:
#!/bin/bash
for i in 1 2 3 4
do
echo $i
done
# 執行該指令碼
[root@Lyl tmp]# chmod 755 for.sh
[root@Lyl tmp]# ./for.sh
1
2
3
4
示例區別:
# 定義一個指令碼param.sh
[root@Lyl tmp]# vim param.sh
# 指令碼內容如下:
#!/bin/bash
# 定義for迴圈,in後面有幾個值,for會迴圈多少次,
# 注意"S*"要用雙引號括起來,每次迴圈會把in後面的值賦予變數i,
# Shell把$*中的所有引數看成是一個整體,所以這個for迴圈只會迴圈一次。
for i in "$*"
do
# 列印變數i的值
echo "迴圈了"$i
done
echo "==============="
# Shell把$@中的每個引數都看成是獨立的,所以“$@"中有幾個引數,就會迴圈幾次。
# 注意兩個for迴圈的變數名最好不相同,以示區別。相同也沒關係。
for j in "$@"
do
# 列印變數j的值
echo "迴圈了"$j
done
# 執行該指令碼
[root@Lyl tmp]# chmod 755 param.sh
[root@Lyl tmp]# ./param.sh 11 22 33 44
迴圈了11 22 33 44
===============
迴圈了11
迴圈了22
迴圈了33
迴圈了44
圖示:
3、位置引數變數$#
$#
:這個變數代表命令列中所有引數的個數。
示例:
# 定義一個指令碼parameter.sh
[root@Lyl tmp]# vim parameter.sh
# 指令碼內容如下:
#!/bin/bash
# 使用$#代表所有引數的個數
echo "The parameters \$# is:$#"
# 執行該指令碼
[root@Lyl tmp]# chmod 755 parameter.sh
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $# is:4