簡體   English   中英

如何在 Bash 的同一行上編寫具有多個條件的 IF 語句?

[英]How do I write an IF statement with multiple conditions on the same line in Bash?

我現在正在 Bash 中編寫一個腳本,它將執行兩個 SQL 查詢並分析查詢的數據。 其中一個命令行輸入接受一個環境變量,它可以是三個值之一。 如果它不是這些值之一,則腳本會顯示一條消息,提示用戶輸入正確的值。 但是,腳本沒有正確檢查該值,而是提示用戶。 這是我的代碼:

if [[ -z $ENV1 || $ENV1 != "ITF" || $ENV1 != "Prod" || $ENV1 != "QA" ]]
then
    read -rp "Please enter the first environment (ITF, Prod, QA): " ENV1
fi
echo $ENV1

我認為在 if 行中有多個 || 是個問題。 我怎樣才能檢查所有這些條件?

看來你的情況有問題。 即使ENV1是您的任何選項,其中一個條件也會成立。 例如, ENV1可能是“QA”,但ENV1 != "Prod"仍將評估為真 (0)。 而不是|| 使用&&

if [[ -z $ENV1 || ($ENV1 != "ITF" && $ENV1 != "Prod" && $ENV1 != "QA") ]]
then
    read -rp "Please enter the first environment (ITF, Prod, QA): " ENV1
fi
echo $ENV1

考慮改用case ,它會使代碼更清晰:

case $ENV1 in
    "ITF" | "Prod" | "QA")
        echo using $ENV1
        ;;
    "")
        read -rp "Please enter the first environment (ITF, Prod, QA): " ENV1
        ;;
    *)
        echo $ENV1 is not valid
        read -rp "Please enter the first environment (ITF, Prod, QA): " ENV1
        ;;
 esac

這是使用select的好時機:

select ENV1 in ITF Prod QA; do 
  case "$ENV1" in 
    ITF|Prod|QA) break;; 
  esac
done

不過沒那么干。


干燥機版本

envs=( ITF Prod QA )
select ENV1 in "${envs[@]}"; do 
  for e in "${envs[@]}"; do 
    [[ $ENV1 == $e ]] && break 2
  done
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM