我现在正在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行中有多个||是个问题。我怎样才能检查所有这些条件?
答案 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