1. 程式人生 > >shell script的預設變數($0,$1...)

shell script的預設變數($0,$1...)

Linux的命令可以帶有引數,例如ls -al可以檢視包含隱藏檔案的所有屬性與許可權。那麼shell script能不能在指令碼檔名後面帶有引數呢。舉例子:重啟系統登錄檔檔案的功能:

上面的命令可以重新啟動/etc/init.d/network這個程式。如果在其後面加個stop呢,很明顯,就可以直接關閉該服務了!

如果想要依據程式的執行給予一些變數去進行不同的任務時(雖然可以使用read命令,但是需要手動鍵盤輸入一些判斷式),就可以通過命令後面接引數,那麼一個命令就能夠處理完畢而不需要手動再次輸入一些變數行為!這樣執行命令會比較簡單方便。

script怎樣實現這個功能呢?script針對引數已經有設定好一些變數名稱了!對應如下:

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

執行指令碼檔名為$0這個變數,第一個接的引數就是$1。因此只要合理在script裡面善用$1,就可以很簡單地立即執行某些命令功能了!除了這些數字的變數之外,還有一些比較特殊的變數可以在script內使用來呼叫這些引數。

  • $#:代表後面接的引數的“個數"
  • [email protected]:代表“$1”,"$2","$3","$4"之意,每個變數都是獨立的(用引號括起來)
  • $*:代表“"$1c$2c$3c$4"”,其中c為分隔符,預設為空格鍵,所以本例中代表“"$1 $2 $3 $4"”之意

上面的[email protected]和$*基本上還是有所不同的。不過,一般使用情況下可以直接記為[email protected]就可以!

栗子:假設要執行一個攜帶引數的script,執行該指令碼後螢幕會顯示如下的資料:

  • 程式的檔名
  • 共有幾個引數
  • 若引數的個數小於2則告知使用者引數數量太少
  • 全部的引數內容
    • 第一個引數
    • 第二個引數
#!/bin/bash
# Program:
#       Program shows the secript name,parameters...
# History:
# 2018/11/25 steve 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 paramter number is  ==> $#"
[ "$#" -lt 2 ] && echo "The number of number paramter is less than 2. Stop here." \ && exit 0
echo "Your whole parameter is ==> '
[email protected]
'" echo "The 1st parameter ==> $1" echo "The 2nd parameter ==> $2"

執行結果如下:

  • shift:造成引數變數號碼偏移
    • 除此之外,指令碼後面所接的變數是否能夠進行偏移(shift)呢?什麼是偏移?見下面的程式碼,將sh07.sh稍作修改,用來顯示每次偏移後引數的變化情況。 
#!/bin/bash
# Program:
#       Program shows the secript name,parameters...
# History:
# 2018/11/25 steve First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo "Total paramter number is  ==> $#"
echo "Your whole parameter is ==> '[email protected]'"
shift # 進行第一次“一個變數的shift”
echo "Total parameter number is ==> $#"
echo "Your whole parameter is ==> '[email protected]'"
shift 3 # 進行第二次“三個變數的shift”
echo "Total paramter number is ==> $#"
echo "Your whole parameter is ==> '[email protected]'" 

執行結果如下:

從上面的執行結果就可以看出,shift會移動變數,並且shift後面可以接數字,代表拿掉最前面的幾個引數的意思。上面的執行結果中,第一次進行shift後面它的顯示情況是“two three four five six",就剩五個引數了!第二次直接拿掉三個,就變成“two three four five six”。這樣這個案例就解釋shift的作用了。