2022/01/27

Special Variable In Linux

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 在執行。

沒有留言: