Shell Script Test(判斷式)

Posted by Anthony Chao on 2021-09-04

Shell Script test(判斷式)

在 Shell Script 中非常容易使用到判斷式,偏偏代號非常的難記,所以想說整理一下

Outline

Basics

1
2
3
4
5
6
7
if [ 條件判斷式 ]; then
...
elif [ 條件判斷式 ]; then
...
else
...
fi

範例一: 確認 uid 是不是 0(root)

1
2
3
4
5
6
if [[ ${UID} -eq 0 ]]
then
echo "YOU ARE ROOT"
else
echo "YOU ARE NOT ROOT"
fi

範例二: 確認輸入值是 y 還是 n

1
2
3
4
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" ]

範例三

1
2
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.

1
2
3
if [ "$APP_TYPE" = app -o "$APP_TYPE" = admin]; then
# do something
fi

也可以用 && 還有 || 來串連判斷式,或者放在後面繼續執行的動作

1
2
[ "$STRING_A" = 'A' ] || [ "$STRING_B" = 'B' ] && export REPO_NAME="Myapp"
[ "$APP_TYPE" = cs ] && export REPO_NAME="MySecondApp"

Basic Concepts

  1. 因為中括號用在很多地方,要注意如果是用在判斷式的話,括號兩端需要有空白
  2. 中括號裡面每個元件都要有空白來分隔
  3. 在中括號內的變數,最好都以雙引號括號起來
  4. 在中括號內的常數,最好都以單或雙引號括號起來
  5. 兩個中括號是 bash 有的用法,有的 shell 可能不支援,但最原始就有一個中括號的用法
  6. 如果去查 [[ 的用法他會說跟 test 的用法依樣,使用 help test 可以查到一些判斷的方法,像是 eq ne

Supplements

===

在判斷式裡面,=== 的意思不同, == 會套用 pattern 的比較,但是 = 必須要完全相同

-t

下面這段的意思是,如果用 interactive shell 的方式跑 bash,會改成執行 zsh

1
2
3
if [ -t 1 ]; then
exec zsh
fi

References





prevent_hack