如何在Bash中的同一行写一个多条件的IF语句?

时间:2011-07-19 19:57:30

标签: 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行中有多个||是个问题。我怎样才能检查所有这些条件?

3 个答案:

答案 0 :(得分:3)

看起来你的病情有问题。即使ENV1是您的任何选项,其中一个条件也是如此。例如,ENV1可能是“QA”,但ENV1 != "Prod"仍将评估为true(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

答案 1 :(得分:1)

请考虑使用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

答案 2 :(得分:1)

现在是使用select的好时机:

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

虽然不那么干。


DRYer版本

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