Shell預定義變數用法詳解

2020-07-16 10:04:33
預定義變數是在 Shell 一開始時就定義的變數,這一點和預設環境變數有些類似。不同的是,預定義變數不能重新定義,使用者只能根據 Shell 的定義來使用這些變數。

嚴格來說,位置引數變數也是預定義變數的一種,知識位置引數變數的作用比較統一,所以我們把位置引數變數單獨劃分為一類數量。

那麼,預定義變數有哪些呢?我們通過表 1 來說明一下。

表 1 預定義變數
預定義變數 作 用
$? 最後一次執行的命令的返回狀態。如果這個變數的值為 0,則證明上一條命令正確執行如果這 個變數的值為非 0 (具體是哪個數由命令自己來決定),則證明上一條命令執行錯誤
$$ 當前進程的進程號(PID)
$! 後台執行的最後一個進程的進程號(PID)

我們先來看看"$?"這個變數,看起來不好理解,還是舉個例子吧,如下:

[[email protected] sh]# ls
count.sh hello.sh parameter2.sh parameter.sh #ls命令正確執行
[[email protected] sh]# echo $?
0
#預定義變數"$?"的值是0,證明上一條命令正確執行
[[email protected] sh]# ls install.log
ls:無法存取install.log:沒有那個檔案或目錄
#當前目錄中沒有instal.log檔案,所以ls命令報錯了
[[email protected] sh]# echo $?
2
#變數"$?"返回一個非0的值,證明上一條命令沒有正確執行
#至於錯誤的返回值到底是多少,是在編寫ls命令時定義好的,如果碰到檔案不存在就返回數值2

這裡需要用到進程號(PID)的概念,我們會在後續章節詳細介紹。這裡大家可以理解為在系統中每個進程都有 HD,我們把這個 ID 稱作 PID,系統是通過 PID 來區分不同的進程的。

接下來說明一下"$$"和"$!"這兩個預定義變數,寫一個指令碼如下所示:

[[email protected] sh]# vi variable.sh
#!/bin/bash
echo "The current process is $$"
#輸出當前進程的PID
#這個PID就是variable.sh指令碼執行時生成的進程的PID
find /root -name hello.sh &
#使用find命令在/root目錄下査找hello.sh檔案
#符號"&"的意思是把命令放入後台執行
echo "The last one Daemon process is $!"
#輸出這個後台執行命令的進程的PID,也就是輸出find命令的PID

執行一下這個命令:

[[email protected] sh]# chmod 755 variable.sh
#賦予執行許可權
[[email protected] sh]#./variable.sh
The current process is 26970
#指令碼variable.s執行時,PID是26970
The last one Daemon process is 26971
#find命令執行時,PID是26971

這裡需要注意的是,不論是指令碼 variable.sh,還是 find 命令,一旦執行完畢就會停止,所以使用 ps 命令是檢視不到這兩個進程號的。

一般情況下使用"$?"變數來判斷上一條命令是否正確執行,我們後面要講的test測試命令也是通過"$?"變數來判斷上一條命令是否正確執行的。使用"$$"變數來給臨時檔案命名,以保證臨時檔名不會重複。