Linux 有許多特殊變數可以使用,要用的時候常常不記得,用這篇統整記錄一下,以後用到其他的會持續更新。
name | description |
---|---|
-G | 存在﹐並且由 GID 所執行的行程所擁有。 |
-L | 存在﹐並且是 symbolic link 。 |
-O | 存在﹐並且由 UID 所執行的行程所擁有。 |
-S | 存在﹐並且是一個 socke 。 |
-b | 存在﹐並且是 block 檔案﹐例如磁碟等。 |
-c | 存在﹐並且是 character 檔案﹐例如終端或磁帶機。 |
-d | 存在﹐並且是一個目錄。 |
-e | 存在。 |
-f | 存在﹐並且是一個檔案。 |
-g | 存在﹐並且有 SGID 屬性。 |
-k | 存在﹐並且有 sticky bit 屬性。 |
-p | 存在﹐並且是用於行程間傳送資訊的 name pipe 或是 FIFO。 |
-r | 存在﹐並且是可讀的。 |
-s | 存在﹐並且體積大於 0 (非空檔)。 |
-u | 存在﹐並且有 SUID 屬性。 |
-w | 存在﹐並且可寫入。 |
-x | 存在﹐並且可執行。 |
-z | 空字串 |
-n | 非空字串 |
整數比較
name | description | example |
---|---|---|
-eq | 等於 | [ integer1 -eq integer2 ] |
-ne | 不等於 | [ integer1 -ne integer2 ] |
-lt | 小於 | [ integer1 -lt integer2 ] |
-gt | 大於 | [ integer1 -gt integer2 ] |
-le | 小於或等於 | [ integer1 -le integer2 ] |
-ge | 大於或等於 | [ integer1 -ge integer2 ] |
特殊變量
name | description |
---|---|
$1~$9 | 函數的第一個到第9個的參數 |
$0 | 函數所在的腳本名 |
$# | 函數的參數總數 |
$* | 函數的全部參數 |
$? | 顯示最後命令的退出狀態,0 表示沒有錯誤,其他表示有錯誤 |
$$ | 腳本運行的當前 process id |
$! | 上一個執行命令的 process id |
$_ | 在此之前執行的命令或者腳本的最後一個參數 |
test.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $#
echo $*
echo $$
bash test.sh a b
test.sh
a
b
2
a b
54877
$?
這個預設變數非常實用,可以用來做許多沒有給足判斷的工具當作一種判斷依據,以這篇 tmux 的範例為例,tmux 的 has-session 並非回傳 boolean,而是 session 存在則無反應,session 不存在時噴出 can’t find session 訊息,因此你無法下這種語法:
if tmux has-session -t "$name"; then
# do something
fi
取而代之的方法就如同我範例那樣抓最後一個 process 的 exit code 當作判斷依據。
$$
則是如果該 bash 為 daemon 時,可以將 pid 存放在某個檔案內,這樣就可以偵測如果該 pid 有檔案時先 kill 該 process 之後在重啟,否則同一時間就會同時有兩個 daemon 在執行。