Bash 初學(xué)者系列 3:給 bash 腳本傳遞參數(shù)
我們?cè)谏弦黄恼轮薪榻B了??如何在 bash 腳本中使用變量???,可以響應(yīng)各種數(shù)據(jù)以及接收用戶輸入。
今天我們將介紹如何通過(guò)命令行將變量以參數(shù)的形式傳遞給 bash 腳本。
向 bash 傳遞參數(shù)
下面腳本 count_lines.sh 將輸出用戶指定的文件的總行數(shù):
例如,用戶可以輸入文件 /etc/passwd,腳本將輸出行數(shù):
腳本運(yùn)行良好;然而,還有進(jìn)一步優(yōu)化的空間。
我們可以讓用戶在運(yùn)行腳本時(shí)簡(jiǎn)單地將文件名作為命令行參數(shù)傳遞,而不是提示用戶輸入文件名,如下所示:
第一個(gè) bash 參數(shù)(也稱為位置參數(shù))可以在 bash 腳本中使用 $1 訪問(wèn)。所以在 count_lines.sh 中,可以按如下方式將文件名變量替換為 $1:?
我們?nèi)サ袅说谝粋€(gè)腳本中的 read 命令和第一個(gè) echo 命令,這樣腳本看起來(lái)更加簡(jiǎn)潔。
這樣,在運(yùn)行腳本的時(shí)候,可以將文件名作為參數(shù)傳遞:?
傳遞多個(gè)參數(shù)
可以一次性向 bash 腳本傳遞多個(gè)參數(shù)。通常情況下,以下是向腳本傳遞多個(gè)參數(shù)的語(yǔ)法:
第二個(gè)參數(shù)將由 $2 變量引用,第三個(gè)參數(shù)由 $3 引用,以此類推。
這里大家可能有一個(gè)疑惑,第一個(gè)變量是 $1,那么 $0 是用來(lái)做什么的呢?其實(shí) $0 變量用于 bash 腳本的名稱。
現(xiàn)在我們?cè)賮?lái)修改一下 count_lines.sh 腳本文件,以便其可以計(jì)算多個(gè)文件的行數(shù),如下:?
運(yùn)行腳本,并傳遞三個(gè)文件作為參數(shù):
如上圖所示,腳本輸出了三個(gè)文件的行數(shù);當(dāng)然,有一點(diǎn)是不言而喻的,輸出信息是依文件順序的。
由 bash shell 中的參數(shù)想到的
Linux 有很多命令,其中有一些比較復(fù)雜,比如有很長(zhǎng)的語(yǔ)法,或者很多的選項(xiàng)。不過(guò)我們可以通過(guò)使用 bash 參數(shù),將那些很難的命令變?yōu)楹芎?jiǎn)單的任務(wù)。
看如下 find.sh 腳本:?
這是一個(gè)很簡(jiǎn)單但是很有用的腳本,提供文件名作為參數(shù),腳本會(huì)打印出文件的位置:
通過(guò)上圖可以看到,這個(gè)腳本比單純的使用 ??find 命令???要簡(jiǎn)單的多。這就說(shuō)明了可以使用參數(shù)將 Linux 中比較復(fù)雜的命令轉(zhuǎn)為比較簡(jiǎn)單的 bash 腳本。
上述腳本中的 2> /dev/null,是指將報(bào)錯(cuò)信息重定向到 /dev/null,也就是不打印報(bào)錯(cuò)信息。大家可參考:
??Linux 中如何將輸出和錯(cuò)誤重定向到 /dev/null??
bash shell 中的特殊變量
bash 中有很多內(nèi)置的特殊變量,使用非常方便。如下是最常見(jiàn)的:
變量 | 描述 |
$0 | bash 腳本的名稱 |
$1, $2...$n | bash 腳本的參數(shù) |
$$ | 當(dāng)前 shell 的進(jìn)程 ID |
$# | 傳遞給腳本的參數(shù)總數(shù) |
$@ | 傳遞給腳本的所有參數(shù)的值 |
$? | 上一個(gè)執(zhí)行命令的退出狀態(tài) |
$! | 上次執(zhí)行命令的進(jìn)程 ID |
大家可以實(shí)際查看一下這些特殊變量,參考如下 variables.sh 腳本:?
然后提供幾個(gè)參數(shù)運(yùn)行腳本: