iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

今天來講shell script 的條件式與相關運算子
在 shell script 中,我們常常需要根據不同的條件來執行不同的動作。例如,我們可能想要判斷一個檔案是否存在,或者一個變數是否等於某個值。為了實現這些功能,我們需要使用條件式與相關的運算子。

條件式的格式

注意: 表達式兩旁須有一個空格

  • 算數條件式(( expr )): 當計算式的值為0時視為false(0), 反之視為true(1)
  • 條件表達式[[ expr ]]: 當裡面的條件式為true時視為true,否則視為false
    • 也可使用 test expr

運算子

運算子通常使用於[[ $a OP $b ]]($a可忽略)這種語法,條件表達式。
運算子會因為變數或值的類別使用不同運算子來做相同的事

基本運算子

  • !: 反向邏輯,通常加在條件式前面
  • &&: AND邏輯,當所有表達式皆為true時為true
  • ||: OR邏輯,當其中一個表達式為true時為true

對於AND與OR,不一定會檢查所有表達式(確定回傳狀態後即可跳出)

數字

  • -eq: 兩數字是否等於
  • -ne: 兩數字是否不等於
  • -lt: 數字1是否小於數字2
  • -gt: 數字1是否大於數字2
    對於想檢查大/小於等於,只需要把t改為e即可

檔案

  • -a: 檢查檔案是否存在
    • -e: 和-a相同用途
    • -d: 檢查該檔案是否為資料夾
    • -f: 檢查該檔案是否為檔案
    • -h, -L: 檢查是否為Symbolic link
    • -r/w/x: 檢查檔案是否可讀/寫/執行
    • -s: 檢查是否為非空檔案

字串

  • =: 檢查兩字串是否相等
    • ==一模一樣,不過=建議與test指令一起使用
  • !=: 檢查兩字串是否不相等
  • >, <: 逐字檢查兩字串的ascii值
    • <: 如果字串1按字典順序排序在字串2之前,則為true。
    • <: 如果字串1按字典順序排序在字串2之前,則為false。
  • -z: 字串長度是否為0(是否為空字串)
  • -n: 字串長度是否為0(字串是否存在)

條件式

有趣的是,在shell script中代表結束條件的關鍵字就是代表開始條件的關鍵字的反向

if

if開頭fi結尾,中間可加多個elif(也就是else if),當其中一個條件式符合時執行對應行為,然後退出條件式
語法像這樣

if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

case

類似於c語言的switch-case或python的match case,不過用來檢查文字是否在某個pattern
範例

# 定義變數
day=$(date +%A)

# 使用 case 判斷變數的值
case $day in
  "Monday")
    echo "今天是星期一"
    ;;
  "Tuesday")
    echo "今天是星期二"
    ;;
  "Wednesday")
    echo "今天是星期三"
    ;;
  "Thursday")
    echo "今天是星期四"
    ;;
  "Friday")
    echo "今天是星期五"
    ;;
  "Saturday")
    echo "今天是星期六"
    ;;
  "Sunday")
    echo "今天是星期天"
    ;;
  *)
    echo "今天是其他日期"
    ;;
esac

REF

https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html
https://shengyu7697.github.io/shell-script-if/
https://tclin914.github.io/2419b51b/


上一篇
Day17: shell script中的for迴圈
下一篇
Day19: 實作篇:使用shell script問chatGPT問題
系列文
I Use Linux BTW: 談Linux與其指令30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言