【问题标题】:An if statement with AND operator [duplicate]带有 AND 运算符的 if 语句 [重复]
【发布时间】:2017-02-03 14:13:33
【问题描述】:

尝试将变量与字符串进行比较,我根据https://unix.stackexchange.com/questions/67898/using-the-not-equal-operator-for-string-comparison的解决方案尝试了代码

if [ "$ACTION" != "dry" ] && [ "$ACTION" != "prune" ]
then
    echo "Invalid"
fi

这对我不起作用,我没有收到任何错误消息,就像它只是跳过了代码块。

我也按照Bash if statement with multiple conditionsBash if statement with multiple conditions的答案尝试过这样的操作

if [[ "$ACTION" != "dry" && "$ACTION" != "prune" ]]
then
    echo "Invalid"
fi

如果 $ACTION 不是“dry”,即使它是“prune”,这也会回显“Invalid”

有什么建议吗?


编辑

完整代码

OPTIND=1
while getopts "b:a:" option
do
    case "${option}"
    in
        b) MERGE_BRANCH=${OPTARG};;
        a) ACTION=${OPTARG};;
    esac
done

if [[ "$ACTION" != "dry" && "$ACTION" != "prune" ]]
then
    echo "Invalid"
fi

shift $((OPTIND-1))
[ "$1" = "--" ] && shift

(( 1 <= ${#} )) || { echo "missing mandatory argument" 2>&1 ; exit 1;     };

【问题讨论】:

  • ACTION 如何设置? declare -p ACTION 的输出是什么?我怀疑该值有尾随空格(特别是回车)。
  • @chepner 声明动作输出正确declare -- ACTION="prune" 它是用这样的getopts 设置的while getopts "b:a:" option do case "${option}" in b) MERGE_BRANCH=${OPTARG};; a) ACTION=${OPTARG};; esac done
  • 如果 $ACTION 不是“dry”,即使它的“prune”→ 不适合我,它也会回显“Invalid”:如果 ACTION 等于 prune,它不会打印“Invalid” .
  • @A.Jac 发布您运行的确切代码以获得您声明的输出,而不是假设您发布的有效代码会产生相同的问题。跨度>
  • 用完整代码编辑了 OP

标签: bash if-statement and-operator


【解决方案1】:

好吧,在大多数出现此类命令的情况下,使用case 提供了一种更易于维护的解决方案,因为在脚本的生命周期中,您将需要更改动作名称、处理新情况等等:

case "$ACTION" in 
  ("dry"|"prune") 
    : # Insert appropriate code
  ;;
  (*)
    echo Invalid
  ;;
esac

其次,这种情况下不需要使用[[语法

if [ "$ACTION" != dry ] && [ "$ACTION" != prune ]; then
  echo Invalid
fi

在这种情况下就足够了。要测试一切是否按预期工作,您可以添加 else 分支:

if [ "$ACTION" != dry ] && [ "$ACTION" != prune ]; then
  echo Invalid
else
  echo Valid
fi

【讨论】:

  • -a 已过时,不应在新代码中使用。请改用[ ... ] &amp;&amp; [ ... ]
  • != 不执行正则表达式匹配;它执行模式匹配如果 RHS 包含未引用的模式。
  • 我使用case 让它工作,并在shift 操作之后移动支票。这似乎按预期工作,使用解决方案更新 OP
  • @chepner 感谢您的 cmets。我相应地更正了我的答案。
  • @A.Jac 这实际上不是一个好习惯。问题应该只是一个问题——而不是一个问题一个答案。如果您添加的只是这个答案,您可以将其删除;如果您找到了不同的解决方案,则应将其添加为正确答案。
【解决方案2】:

解决方案

根据@Dario 的回答使用大小写并将检查移到移位操作之后,使代码按预期工作。

OPTIND=1

while getopts "b:a:" option
do
    case "${option}"
    in
        b) MERGE_BRANCH=${OPTARG};;
        a) ACTION=${OPTARG};;
    esac
done

shift $((OPTIND-1))
[ "$1" = "--" ] && shift

(( 1 <= ${#} )) || { echo "missing mandatory argument" 2>&1 ; exit 1; };

case "$ACTION" in
  (dry|prune)
    :
  ;;
  (*)
    echo "Invalid argument"
    exit 1
  ;;
esac

【讨论】:

  • 我很高兴您的代码现在可以正常工作,但我真的看不出这有什么显着影响。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
相关资源
最近更新 更多