Shell Script Test(判斷式)
Shell Script test(判斷式)
在 Shell Script 中非常容易使用到判斷式,偏偏代號非常的難記,所以想說整理一下
Outline
Basics
if [ 條件判斷式 ]; then
...
elif [ 條件判斷式 ]; then
...
else
...
fi
範例一: 確認 uid 是不是 0(root)
if [[ ${UID} -eq 0 ]]
then
echo "YOU ARE ROOT"
else
echo "YOU ARE NOT ROOT"
fi
範例二: 確認輸入值是 y 還是 n
read -p "Please input (Y/N): " yn
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0
其中的
[ "${yn}" == "Y" -o "${yn}" == "y" ]
也可以這樣改寫:
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]
範例三
if [[ ! -d "${ARCHIVE_DIR}" ]]
# 如果資料夾不存在的話...
Options in brackets
| symbol | meaning | 白話文 |
|---|---|---|
| -f | 如果這個檔案存在,而且是一個 file,則為真 | 有這個檔案存在的話就… |
| -d | 如果這個檔案存在,而且是一個 folder,則為真 | 有這個資料夾存在的話就… |
| -e | 如果這個檔案存在則為真 | 有這個檔案存在(不管他是 file 還是 folder)的話就… |
| -h | 如果這個檔案存在,而且是一個 symlink,則為真 | |
| -r | 如果這個檔案存在,而且 readable,則為真 | |
| -w | 如果這個檔案存在,而且 writable,則為真 | |
| -x | 如果這個檔案存在,而且 executable,則為真 | |
| -z | string 長度為 0 則為真 | 這個 string 沒東西的話就… |
| -n | string 不是 null 則為真 | 這個 string 有東西的話就… |
| -s | 檔案大小大於 0 為真 |
| symbol | meaning | |
|---|---|---|
| -eq | 等於 | |
| -ne | 不等於 | |
| -gt | 大於 | |
| -lt | 小於 | |
| -ge | 大於等於 | |
| -le | 小於等於 |
Multiple tests
這部分其實前面的例子就有寫到
| symbol | meaning | |
|---|---|---|
| -o | or | |
| -a | and |
ex.
if [ "$APP_TYPE" = app -o "$APP_TYPE" = admin]; then
# do something
fi
也可以用 && 還有 || 來串連判斷式,或者放在後面繼續執行的動作
[ "$STRING_A" = 'A' ] || [ "$STRING_B" = 'B' ] && export REPO_NAME="Myapp"
[ "$APP_TYPE" = cs ] && export REPO_NAME="MySecondApp"
Basic Concepts
- 因為中括號用在很多地方,要注意如果是用在判斷式的話,括號兩端需要有空白
- 中括號裡面每個元件都要有空白來分隔
- 在中括號內的變數,最好都以雙引號括號起來
- 在中括號內的常數,最好都以單或雙引號括號起來
- 兩個中括號是 bash 有的用法,有的 shell 可能不支援,但最原始就有一個中括號的用法
- 如果去查
[[的用法他會說跟test的用法依樣,使用help test可以查到一些判斷的方法,像是eqne
Supplements
= 跟 ==
在判斷式裡面,= 跟 == 的意思不同, == 會套用 pattern 的比較,但是 = 必須要完全相同
-t
下面這段的意思是,如果用 interactive shell 的方式跑 bash,會改成執行 zsh
if [ -t 1 ]; then
exec zsh
fi