Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带有AND运算符的if语句_Bash_If Statement_And Operator - Fatal编程技术网

Bash 带有AND运算符的if语句

Bash 带有AND运算符的if语句,bash,if-statement,and-operator,Bash,If Statement,And Operator,尝试将变量与字符串进行比较,我尝试按照来自的解决方案编写代码 这对我不起作用,我没有收到任何错误消息,就像它跳过了代码块一样 根据这里的回答,我也试过这样做 如果$ACTION不是“dry”,即使它的“prune”,它也会重复“Invalid” 有什么建议吗 编辑 完整代码 OPTIND=1 while getopts "b:a:" option do case "${option}" in b) MERGE_BRANCH=${OPTARG};;

尝试将变量与字符串进行比较,我尝试按照来自的解决方案编写代码

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

根据这里的回答,我也试过这样做

如果$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;     };
OPTIND=1
而getopts“b:a:”选项
做
案例“${option}”
在里面
b) MERGE_BRANCH=${OPTARG};;
a) ACTION=${OPTARG};;
以撒
完成
如果[[“$ACTION”!=“dry”&&“$ACTION”!=“prune”]]
然后
回音“无效”
fi
班次$((可选ND-1))
[“$1”=“--”]&&shift
((1&1;出口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

嗯,在大多数出现此类命令的情况下,使用
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

解决方案

根据@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
OPTIND=1
而getopts“b:a:”选项
做
案例“${option}”
在里面
b) MERGE_BRANCH=${OPTARG};;
a) ACTION=${OPTARG};;
以撒
完成
班次$((可选ND-1))
[“$1”=“--”]&&shift
((1&1;出口1;);
中的案例“$ACTION”
(干燥|修剪)
:
;;
(*)
回显“无效参数”
出口1
;;
以撒

解决方案

根据@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
OPTIND=1
而getopts“b:a:”选项
做
案例“${option}”
在里面
b) MERGE_BRANCH=${OPTARG};;
a) ACTION=${OPTARG};;
以撒
完成
班次$((可选ND-1))
[“$1”=“--”]&&shift
((1&1;出口1;);
中的案例“$ACTION”
(干燥|修剪)
:
;;
(*)
回显“无效参数”
出口1
;;
以撒


ACTION如何设置?declare-p ACTION的输出是什么?我怀疑该值后面有空格(特别是回车符)。@chepner declaring ACTION输出正确
declare--ACTION=“prune”
它是这样用getopts设置的
,而getopts“b:a:“option do case”${option}在b)MERGE_BRANCH=${OPTARG};;a)ACTION=${OPTARG};esac done
如果$ACTION不是“dry”,即使是“prune”,也会重复“Invalid”→ 不适合我:它不打印“无效”如果
ACTION
等于
prune
@A.Jac发布您运行以获得您声明的输出的确切代码,而不是假设您发布的有效代码将产生相同的问题。编辑了完整代码的OP如何设置
ACTION
声明-p操作的输出是什么?我怀疑该值后面有whitespace(特别是回车)。@chepner声明操作正确地输出
declare--action=“prune”
它是用getopts设置的,如下面的
,而getopts“b:a:”选项do case“${option}”在b)MERGE_BRANCH=${OPTARG};;a)ACTION=${OPTARG};;esac done
如果$ACTION不是“dry”,即使其“prune”,也会回显“Invalid”→ 不适合我:如果
ACTION
等于
prune
@A.Jac发布您运行以获得您声明的输出的确切代码,而不是假设您发布的有效代码将产生相同的问题,则不会打印“Invalid”。使用完整代码
-A
编辑的OP已过时,不应在新代码中使用。请使用
[…]&&[ ... ]
相反。
!=
不执行正则表达式匹配;如果RHS包含一个不带引号的模式,它将执行模式匹配。我使用
case
并在
shift
操作后移动检查。这似乎按照预期工作,使用solution@chepner谢谢你的评论。我很高兴@A.Jac这实际上不是一个好的做法。问题应该只是一个问题,而不是一个问题和一个答案。如果你添加的只是这个答案,你可以删除它;如果你找到了不同的解决方案,你应该添加它作为一个正确的答案。
-A
是过时的,不应该在ne中使用w代码。使用
[…]和&[…]
相反。
!=
不执行正则表达式匹配;如果RHS包含一个不带引号的模式,它将执行模式匹配。我使用
case
并在
shift
操作后移动检查。这似乎按照预期工作,使用solution@chepner谢谢你的评论。我很高兴因此,我的答案是。@A.Jac这实际上不是一个好的做法。问题应该是这样,一个问题,而不是一个问题和一个答案。如果你添加的只是这个答案,你可以删除它;如果你找到了不同的解决方案,你应该添加它作为一个正确的答案。我很高兴你的代码正在工作,但我真的很高兴