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 |
$_ |
在此之前執行的命令或者腳本的最後一個參數 |
| #!/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 |
| |
| fi |
取而代之的方法就如同我範例那樣抓最後一個 process 的 exit code 當作判斷依據。
$$
則是如果該 bash 為 daemon 時,可以將 pid 存放在某個檔案內,這樣就可以偵測如果該 pid 有檔案時先 kill 該 process 之後在重啟,否則同一時間就會同時有兩個 daemon 在執行。