使用带有 or 的 if 语句来验证 shell 脚本的参数

使用带有 or 的 if 语句来验证 shell 脚本的参数

我正在编写一个 bash 脚本来在不同环境中重新启动多个 apache 实例。它工作正常,除了我想添加一些逻辑以确保只输入正确的参数。我已经以多种方式尝试了以下声明,但我没有任何运气。有什么建议么?

if [[ $ENVT != qa || $ENVT != qa2 || $ENVT != stageqa || $ENVT != stage ]];
  then
    usage
fi

当我使用舞台环境时,它正在评估第一个选项并调用该函数,而不是像set -x打开时那样进行迭代。

+ ENVT=stage
+ ACTION=stop
+ USER=www
+ '[' 2 -ne 2 ']'
+ [[ stage != qa ]]
+ usage

答案1

if在这种情况下,您不应使用多个条件,case而是使用:

case "$ENVT" in
  (qa|qa2|stageqa|stage) ;;
  (*) usage ;;
esac

答案2

我预计质量保证,质量保证2等等假的更复杂测试的值。如果它们是真实的价值观,@Gnouc的解决方案是好多了明显地。
我将把这个答案留在这里,以获得与原始示例语法相关的教育价值。


您可能需要一个“and”与“!=”一起使用。

然后,您不应该将许多表达式或运算符链接在一起,而是使用像这样的单独测试(它与引号相关):

if [[ a1 != b1 ]] && [[ a2 != b2 ]] && [[ a3 != b3 ]] ...

就像是:

if [[ "$ENVT" != qa ]] && [[ "$ENVT" != qa2 ]] && [[ "$ENVT" != stageqa ]] && [[ "$ENVT" != stage ]];
then
    usage
fi

如您所见,我在变量周围添加了引号。这在双 [[ ]] 内部并不是绝对必要的,但几乎在其他任何地方,例如在 [ ] 中,它们都非常相似。习惯总是引用已经够难的了,所以我就保留引用。

相关内容