Bash 带有AND运算符的if语句
尝试将变量与字符串进行比较,我尝试按照来自的解决方案编写代码 这对我不起作用,我没有收到任何错误消息,就像它跳过了代码块一样 根据这里的回答,我也试过这样做 如果$ACTION不是“dry”,即使它的“prune”,它也会重复“Invalid” 有什么建议吗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};;
编辑 完整代码
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这实际上不是一个好的做法。问题应该是这样,一个问题,而不是一个问题和一个答案。如果你添加的只是这个答案,你可以删除它;如果你找到了不同的解决方案,你应该添加它作为一个正确的答案。我很高兴你的代码正在工作,但我真的很高兴