Linux基礎(chǔ)

Shell script 的預(yù)設(shè)變數(shù)($0, $1...)

我們知道指令可以帶有選項(xiàng)與參數(shù),例如 ls -la 可以察看包含隱藏檔的所有屬性與權(quán)限。那么 shell script 
能不能在腳本檔名后面帶有參數(shù)呢?很有趣喔!舉例來(lái)說(shuō),如果你想要重新啟動(dòng)系統(tǒng)登錄檔的功能,可以這樣做:

[root@www ~]# file /etc/init.d/syslog

/etc/init.d/syslog: Bourne-Again shell script text executable

# 使用 file 來(lái)查詢后,系統(tǒng)告知這個(gè)檔案是個(gè) bash 的可執(zhí)行 script 喔!

[root@www ~]# /etc/init.d/syslog restart

restart 是除新啟動(dòng)的意思,上面的指令可以‘重新啟動(dòng) /etc/init.d/syslog 這支程式’的意思! 唔!那么如果你在 
/etc/init.d/syslog 后面加上 stop 呢?沒錯(cuò)!就可以直接關(guān)閉該服務(wù)了!這么神奇??? 
沒錯(cuò)啊!如果你要依據(jù)程式的執(zhí)行給予一些變數(shù)去進(jìn)行不同的任務(wù)時(shí),本章一開始是使用 read
的功能!但 read 
功能的問(wèn)題是你得要手動(dòng)由鍵盤輸入一些判斷式。如果透過(guò)指令后面接參數(shù), 
那么一個(gè)指令就能夠處理完畢而不需要手動(dòng)再次輸入一些變數(shù)行為!這樣下達(dá)指令會(huì)比較簡(jiǎn)單方便啦!

script 是怎么達(dá)成這個(gè)功能的呢?其實(shí) script 針對(duì)參數(shù)已經(jīng)有設(shè)定好一些變數(shù)名稱了!對(duì)應(yīng)如下:

/path/to/scriptname opt1 opt2 opt3 opt4 
 $0 $1 $2 $3 $4

這樣夠清楚了吧?執(zhí)行的腳本檔名為 $0 這個(gè)變數(shù),第一個(gè)接的參數(shù)就是 $1 啊~ 所以,只要我們?cè)?script 里面善用 $1 
的話,就可以很簡(jiǎn)單的立即下達(dá)某些指令功能了!除了這些數(shù)字的變數(shù)之外, 我們還有一些較為特殊的變數(shù)可以在 script 內(nèi)使用來(lái)呼叫這些參數(shù)喔!

$# :代表后接的參數(shù)‘個(gè)數(shù)’,以上表為例這里顯示為‘ 4 ’; 
$@ :代表‘ "$1" "$2" "$3" "$4" ’之意,每個(gè)變數(shù)是獨(dú)立的(用雙引號(hào)括起來(lái)); 
$* :代表‘ "$1c
$2c
$3c
$4" ’,其中c
為分隔字元,預(yù)設(shè)為空白鍵, 
所以本例中代表‘ "$1 $2 $3 $4" ’之意。

那個(gè) $@ 與 $* 基本上還是有所不同啦!不過(guò),一般使用情況下可以直接記憶 $@ 即可! 好了,來(lái)做個(gè)例子吧~假設(shè)我要執(zhí)行一個(gè)可以攜帶參數(shù)的 
script ,執(zhí)行該腳本后熒幕會(huì)顯示如下的資料:

程式的檔名為何? 
共有幾個(gè)參數(shù)? 
若參數(shù)的個(gè)數(shù)小于 2 則告知使用者參數(shù)數(shù)量太少 
全部的參數(shù)內(nèi)容為何? 
第一個(gè)參數(shù)為何? 
第二個(gè)參數(shù)為何

[root@www scripts]# vi sh07.sh

#!/bin/bash
# Program:
#   Program shows the script name, parameters...
# History:
# 2009/02/17    VBird   First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "The script name is ==> $0"
echo "Total parameter number is ==> $#"
[ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." \
    && exit 0
echo "Your whole parameter is ==> '$@'"
echo "The 1st parameter ==> $1"
echo "The 2nd parameter ==> $2"

執(zhí)行結(jié)果如下:

[root@www scripts]# sh sh07.sh theone haha quot

The script name is ==> sh07.sh <==檔名

Total parameter number is ==> 3 <==果然有三個(gè)參數(shù)

Your whole parameter is ==> 'theone haha quot' <==參數(shù)的內(nèi)容全部

The 1st parameter ==> theone <==第一個(gè)參數(shù)

The 2nd parameter ==> haha <==第二個(gè)參數(shù)

shift:造成參數(shù)變數(shù)號(hào)碼偏移

除此之外,腳本后面所接的變數(shù)是否能夠進(jìn)行偏移 (shift) 呢?什么是偏移?。课覀冎苯右缘紫碌姆独齺?lái)說(shuō)明好了, 用范例說(shuō)明比較好解釋!我們將 
sh07.sh 的內(nèi)容稍作變化一下,用來(lái)顯示每次偏移后參數(shù)的變化情況:

[root@www scripts]# vi sh08.sh

#!/bin/bash
# Program:
#   Program shows the effect of shift function.
# History:
# 2009/02/17    VBird   First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift # 進(jìn)行第一次‘一個(gè)變數(shù)的 shift ’

echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"
shift 3 # 進(jìn)行第二次‘三個(gè)變數(shù)的 shift ’

echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '$@'"

這玩意的執(zhí)行成果如下:

[root@www scripts]# sh sh08.sh one two three four five six
<==給予六個(gè)參數(shù)

Total parameter number is ==> 6 <==最原始的參數(shù)變數(shù)情況

Your whole parameter is ==> 'one two three four five six'
Total parameter number is ==> 5 <==第一次偏移,看底下發(fā)現(xiàn)第一個(gè) one 不見了

Your whole parameter is ==> 'two three four five six'
Total parameter number is ==> 2 <==第二次偏移掉三個(gè),two three four 不見了

Your whole parameter is ==> 'five six'

光看結(jié)果你就可以知道啦,那個(gè) shift 會(huì)移動(dòng)變數(shù),而且 shift 后面可以接數(shù)字,代表拿掉最前面的幾個(gè)參數(shù)的意思。 上面的執(zhí)行結(jié)果中,第一次進(jìn)行 
shift 后他的顯示情況是‘ one
two three 
four five six’,所以就剩下五個(gè)啦!第二次直接拿掉三個(gè),就變成‘ two three four
five six ’啦! 
這樣這個(gè)案例可以了解了嗎?理解了 shift 的功能了嗎?

上面這8個(gè)例子都很簡(jiǎn)單吧?幾乎都是利用 bash 的相關(guān)功能而已~ 
不難啦~底下我們就要使用條件判斷式來(lái)進(jìn)行一些分別功能的設(shè)定了,好好瞧一瞧先~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容