位置參數(shù)變量的作用主要用于腳本的傳參。
位置參數(shù)變量的名稱(chēng)和作用都是確定不能改變的,但是該變量的內(nèi)容是可以更改的,也就是變量的值坏匪。
位置參數(shù)變量如下:
位置參數(shù)變量 | 作用 |
---|---|
$n |
n為數(shù)字,$0 代表命令本身撬统,$1-$9 代表(腳本命令后的)第一到第九個(gè)參數(shù)适滓,十以上的參數(shù)需要用大括號(hào)包含,如${10} 恋追、${15} 凭迹。 |
$* |
這個(gè)變量代表命令行中所有的參數(shù),$* 把所有的參數(shù)看成一個(gè)整體几于。 |
$@ |
這個(gè)變量也代表命令行中所有的參數(shù)蕊苗,不過(guò)$@ 把每個(gè)參數(shù)區(qū)分對(duì)待。 |
$# |
這個(gè)變量代表命令行中所有參數(shù)的個(gè)數(shù)沿彭。 |
1朽砰、位置參數(shù)變量$n
$n
:n為數(shù)字,$0
代表命令本身喉刘,$1-$9
代表(腳本命令的)第一到第九個(gè)參數(shù)瞧柔,十以上的參數(shù)需要用大括號(hào)包含,如${10}
睦裳、${15}
造锅。(這個(gè)是一個(gè)典型的向Shell腳本當(dāng)中傳遞值的方式)
(1)示例
# 定義一個(gè)shell腳本,簡(jiǎn)單的計(jì)算器廉邑,求兩個(gè)數(shù)的和哥蔚。
[root@Lyl tmp]# vim count.sh
# 腳本內(nèi)容如下:
#!/bin/bash
# 給num1變量賦值是第一個(gè)參數(shù)
num1=$1
# 給num2變量賦值是第二個(gè)參數(shù)
num2=$2
# 變量sum是變量num1加變量num2的(其實(shí)上邊的num1和num2的定義可以省略)
sum=$(($num1 + $num2))
# 注意:執(zhí)行count.sh腳本后的第一個(gè)參數(shù)會(huì)傳遞給$1,第二個(gè)參數(shù)會(huì)傳遞給$2蛛蒙,
# 然后$num1和$num2進(jìn)行求和糙箍,再賦值給sum變量。
# 但是Shell中自定義變量的默認(rèn)類(lèi)型是字符串類(lèi)型牵祟,
# 而我們傳入的兩個(gè)數(shù)字類(lèi)型的變量值深夯,Shell默認(rèn)都識(shí)別為字符串類(lèi)型。
# 而這個(gè)時(shí)候我們就需要$(( ))把這個(gè)兩個(gè)字符串類(lèi)型的數(shù)值括起來(lái)诺苹,
# Shell才能知道要進(jìn)行數(shù)值運(yùn)算咕晋,里邊的參數(shù)都是數(shù)值(Shell運(yùn)算符中會(huì)詳細(xì)講)。
# 而$( )是括系統(tǒng)命令的收奔,然后把該命令運(yùn)行的結(jié)果掌呜,賦值給前面的變量,這個(gè)我們要注意坪哄。
#打印變量sum的值
echo $sum
echo $0
# 執(zhí)行該腳本
[root@Lyl tmp]# chmod 755 count.sh
[root@Lyl tmp]# ./count.sh 22 66
88
./count.sh
(2)總結(jié):
- $1保存的是執(zhí)行Shell命令之后的第一個(gè)參數(shù)站辉,
- $2保存的是執(zhí)行Shell命令之后的第二個(gè)參數(shù)呢撞,
- $0代表執(zhí)行腳本的命令,如上邊的
./count.sh
饰剥。
-
位置參數(shù)變量好處
其作用就是把執(zhí)行腳本命令后輸入的參數(shù),傳入到腳本中摧阅,使腳本中的變量可以靈活取值汰蓉。
-
位置參數(shù)變量的缺點(diǎn)
如果是一個(gè)普通的Linux用戶,該腳本并不是自己寫(xiě)的棒卷。當(dāng)你獲得該腳本的時(shí)候顾孽,你是無(wú)法知道需要在腳本后邊是否加參數(shù),或者是加什么參數(shù)比规,腳本才能正確運(yùn)行若厚,是沒(méi)有任何提示的。
所以用位置參數(shù)變量傳參蜒什,并不適合給普通用戶來(lái)使用测秸,一般是寫(xiě)的腳本自己用的時(shí)候,用的比較多灾常。
提示:
位置參數(shù)變量也可以給函數(shù)中傳參(其實(shí)就是自己給自己傳值)霎冯。
給普通用戶的腳本,傳參的方式用
read
钞瀑,會(huì)有提示沈撞,比較友好赃磨,我們之后說(shuō)明眨补。
2蹬癌、位置參數(shù)變量$*
和$@
$*
:這個(gè)變量代表命令行中所有的參數(shù)泰佳,$*
把所有的參數(shù)看成一個(gè)整體道伟。
$@
:這個(gè)變量也代表命令行中所有的參數(shù)融击,不過(guò)$@
把每個(gè)參數(shù)區(qū)分對(duì)待惠猿。
(1)用法
我們先寫(xiě)一個(gè)腳本來(lái)展示一下位置參數(shù)變量$*
和$@
的用法:
# 定義一個(gè)腳本parameter.sh
[root@Lyl tmp]# vim parameter.sh
# 腳本內(nèi)容如下:
#!/bin/bash
# 使用$*代表所有的參數(shù)(所有參數(shù)整體對(duì)待)
echo "The parameters \$* is:$*"
# 使用也代表所有參數(shù)(所有參數(shù)分開(kāi)對(duì)待)
echo "The parameters \$@ is:$@"
# 執(zhí)行該腳本
[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
我們可以看到位置參數(shù)變量$*
和$@
俺孙,都把執(zhí)行腳本命令后邊帶的參數(shù)打印出來(lái)了凰盔。
(2)區(qū)別
位置參數(shù)變量$\*
和$@
的區(qū)別是墓卦,$*
把所有參數(shù)當(dāng)作一個(gè)整體,而$@
是先把11賦值給$@
户敬,在把22賦值給$@
落剪,以此類(lèi)推,是分開(kāi)的尿庐。
我們通過(guò)下邊的例子來(lái)說(shuō)明:
# 我們先簡(jiǎn)單的來(lái)說(shuō)一下for循環(huán)
# 簡(jiǎn)單的for循環(huán)例子
for i in 1 2 3 4
do
echo $i
done
# 說(shuō)明:
# 在in后有幾個(gè)數(shù)或者說(shuō)是以空格隔開(kāi)的變量(因?yàn)槟J(rèn)都是字符串類(lèi)型)忠怖,
# in后有幾個(gè)變量,這個(gè)for循環(huán)就循環(huán)幾次抄瑟。
# 第一次循環(huán)凡泣,把第一個(gè)變量賦值給in前邊的變量i,然后進(jìn)入循環(huán)操作。
# 這只是for循環(huán)的一種形式鞋拟,知道流程即可骂维,后邊會(huì)在詳細(xì)說(shuō)明Bash中的for循環(huán)。
# do和done就類(lèi)似于Java中for循環(huán)的大括號(hào)(先這樣理解就可以)贺纲。
# 寫(xiě)一個(gè)for循環(huán)腳本
[root@Lyl tmp]# vim for.sh
# 腳本內(nèi)容如下:
#!/bin/bash
for i in 1 2 3 4
do
echo $i
done
# 執(zhí)行該腳本
[root@Lyl tmp]# chmod 755 for.sh
[root@Lyl tmp]# ./for.sh
1
2
3
4
示例區(qū)別:
# 定義一個(gè)腳本param.sh
[root@Lyl tmp]# vim param.sh
# 腳本內(nèi)容如下:
#!/bin/bash
# 定義for循環(huán)航闺,in后面有幾個(gè)值,for會(huì)循環(huán)多少次猴誊,
# 注意"S*"要用雙引號(hào)括起來(lái)潦刃,每次循環(huán)會(huì)把in后面的值賦予變量i,
# Shell把$*中的所有參數(shù)看成是一個(gè)整體懈叹,所以這個(gè)for循環(huán)只會(huì)循環(huán)一次乖杠。
for i in "$*"
do
# 打印變量i的值
echo "循環(huán)了"$i
done
echo "==============="
# Shell把$@中的每個(gè)參數(shù)都看成是獨(dú)立的,所以“$@"中有幾個(gè)參數(shù)澄成,就會(huì)循環(huán)幾次胧洒。
# 注意兩個(gè)for循環(huán)的變量名最好不相同,以示區(qū)別环揽。相同也沒(méi)關(guān)系略荡。
for j in "$@"
do
# 打印變量j的值
echo "循環(huán)了"$j
done
# 執(zhí)行該腳本
[root@Lyl tmp]# chmod 755 param.sh
[root@Lyl tmp]# ./param.sh 11 22 33 44
循環(huán)了11 22 33 44
===============
循環(huán)了11
循環(huán)了22
循環(huán)了33
循環(huán)了44
圖示:
3、位置參數(shù)變量$#
$#
:這個(gè)變量代表命令行中所有參數(shù)的個(gè)數(shù)歉胶。
示例:
# 定義一個(gè)腳本parameter.sh
[root@Lyl tmp]# vim parameter.sh
# 腳本內(nèi)容如下:
#!/bin/bash
# 使用$#代表所有參數(shù)的個(gè)數(shù)
echo "The parameters \$# is:$#"
# 執(zhí)行該腳本
[root@Lyl tmp]# chmod 755 parameter.sh
[root@Lyl tmp]# ./parameter.sh 11 22 33 44
The parameters $# is:4