0

尝试将变量与字符串进行比较,我根据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 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;     };
4

2 回答 2

3

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

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
于 2017-02-03T14:41:13.923 回答
0

解决方案

根据@Dario 的回答使用 case 并将检查移到 shift 操作之后使代码按预期工作。

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
于 2017-02-03T15:06:19.580 回答