Shell 特殊變量

shell編程中有一些特殊的變量可使用。這些變量在腳本中能夠做爲全局變量來使用。html

名稱 說明
$0 執行腳本的名稱
$1-9 腳本執行時的參數1到參數9
$? 腳本的返回值,表明上一個命令是否執行成功,若是成功,則爲0,不然不成功
$! 表明最後執行的後臺命令的PID    
$# 腳本執行時,輸入的參數的個數
$@ 輸入的參數的具體內容(將輸入的參數做爲一個多個對象,便是全部參數的一個列表)
$* 輸入的參數的具體內容(將輸入的參數做爲一個單詞)

示例

源代碼:
echo "腳本的名字是:"$0
n=1
echo "使用\$@的參數列表爲:"$@
for temstr in "$@"
do
        echo "第$n個參數是:" $temstr
        let n+=1
done
n=1
echo "使用\$*的參數列表爲:"$*
for temstr in "$*"
do
        echo "第$n個參數是:" $temstr
        let n+=1
done

執行結果:shell

$ ./test.sh 1 2 3 4
腳本的名字是:./test.sh
使用$@的參數列表爲:1 2 3 4
第1個參數是: 1
第2個參數是: 2
第3個參數是: 3
第4個參數是: 4
使用$*的參數列表爲:1 2 3 4
第1個參數是: 1 2 3 4

在上面的例子中,使用$@$*是,都是用雙引號引發來,但當$*不使用雙引號時,結果與$@的結果相同。編程

緣由分析:當都使用雙引號時,咱們能夠看到參數列表輸出都是同樣的,說明確實兩個變量均可以存儲全部的參數內容,也就顯示出來兩個變量之間的對參數處理的不一樣,即一個將其做爲列表處理,一個講全部參數做爲一個單詞處理。當$*不適用雙引號時,執行到for語句時,會首先將$*的值(1 2 3 4 )取出來,而後循環語句就變成了 for tem in 1 2 3 4 ,最後的輸出結果也就變成了列表的循環輸出。spa

$@$*的區別:

  • $@$*均可以使用一個變量來來表示全部的參數內容,但這兩個變量之間有一些不一樣之處。
  • $@:將輸入的參數做爲一個列表對象
  • $*:將輸入的參數做爲一個單詞

單引號、雙引號以及沒有引號的區別:

單引號:

能夠說是所見即所得:即將單引號內的內容原樣輸出,或者描述爲單引號裏面看見的是什麼就會輸出什麼。.net

雙引號:

  • 把雙引號內的內容輸出出來;若是內容中有命令,變量等,會先把變量,命令解析出結果,而後在輸出最終內容來。
  • 雙引號內命令或變量的寫法爲命令或變量或$(命令或變量)。

無引號:

  • 把內容輸出出來,可能不會講含有空格的字符串視爲一個總體輸出;
  • 若是內容中有命令、變量等,會先把變量、命令解析結果,而後在輸出最終內容來;
  • 若是字符串中帶有空格等特殊字符,則不能完整的輸出,須要改加雙引號,通常連續的字符串,數字,路徑等能夠用,不過最好用雙引號替代之

Linux 狀態碼的意義

狀態碼 意義
0 命令成功結束
1 通用未知錯誤
2 誤用shell命令
126 命令不可執行
127 沒找到命令
128 無效退出參數
128+x Linux 信號x的嚴重錯誤
130 Linux 信號2 的嚴重錯誤,即命令經過SIGINT(Ctrl+C)終止
255 退出狀態碼越界

默認狀態下,shell腳本會以腳本中的最後一個命令做爲退出狀態碼。因此通常狀況下,在shell腳本中以 exit 命令的值來指定shell命令的退出狀態碼。可是退出狀態碼的範圍是 0 ~ 255, 退出值超出這個範圍將會執行取模運算。例如經過exit 命令指定返回值爲300,通過取模運算,那麼退出狀態碼就爲44code

參考

相關文章
相關標籤/搜索