Shell Script test(判斷式)
在 Shell Script 中非常容易使用到判斷式,偏偏代號非常的難記,所以想說整理一下
Outline
Basics
1 | if [ 條件判斷式 ]; then |
範例一: 確認 uid 是不是 0(root)
1 | if [[ ${UID} -eq 0 ]] |
範例二: 確認輸入值是 y 還是 n
1 | read -p "Please input (Y/N): " yn |
其中的
[ "${yn}" == "Y" -o "${yn}" == "y" ]
也可以這樣改寫:
[ "${yn}" == "Y" ] || [ "${yn}" == "y" ]
範例三
1 | 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 | if [ "$APP_TYPE" = app -o "$APP_TYPE" = admin]; then |
也可以用 &&
還有 ||
來串連判斷式,或者放在後面繼續執行的動作
1 | [ "$STRING_A" = 'A' ] || [ "$STRING_B" = 'B' ] && export REPO_NAME="Myapp" |
Basic Concepts
- 因為中括號用在很多地方,要注意如果是用在判斷式的話,括號兩端需要有空白
- 中括號裡面每個元件都要有空白來分隔
- 在中括號內的變數,最好都以雙引號括號起來
- 在中括號內的常數,最好都以單或雙引號括號起來
- 兩個中括號是 bash 有的用法,有的 shell 可能不支援,但最原始就有一個中括號的用法
- 如果去查
[[
的用法他會說跟test
的用法依樣,使用help test
可以查到一些判斷的方法,像是eq
ne
Supplements
=
跟 ==
在判斷式裡面,=
跟 ==
的意思不同, ==
會套用 pattern 的比較,但是 =
必須要完全相同
-t
下面這段的意思是,如果用 interactive shell 的方式跑 bash,會改成執行 zsh
1 | if [ -t 1 ]; then |