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 在執行。
沒有留言:
張貼留言