Anthony Chao

Shell Script Test(判斷式)

#Shell

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

symbolmeaning白話文
-f如果這個檔案存在,而且是一個 file,則為真有這個檔案存在的話就…
-d如果這個檔案存在,而且是一個 folder,則為真有這個資料夾存在的話就…
-e如果這個檔案存在則為真有這個檔案存在(不管他是 file 還是 folder)的話就…
-h如果這個檔案存在,而且是一個 symlink,則為真
-r如果這個檔案存在,而且 readable,則為真
-w如果這個檔案存在,而且 writable,則為真
-x如果這個檔案存在,而且 executable,則為真
-zstring 長度為 0 則為真這個 string 沒東西的話就…
-nstring 不是 null 則為真這個 string 有東西的話就…
-s檔案大小大於 0 為真
symbolmeaning
-eq等於
-ne不等於
-gt大於
-lt小於
-ge大於等於
-le小於等於

Multiple tests

這部分其實前面的例子就有寫到

symbolmeaning
-oor
-aand

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

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

Supplements

===

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

-t

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

if [ -t 1 ]; then
  exec zsh
fi

References