我正在寻找一种根据 bash 中 case 条件内的 if 条件发生失败的方法。例如:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
在上面的代码中,如果变量VAR
是1
,我想让 case 条件执行失败。
答案1
你不能。实现失败的方法case
是将分隔符替换;;
为;&
(或;;&
)。将其放入 if 中是一个语法错误。
您可以将整个逻辑写成常规条件:
if [ "$input" != "foo" ] || [ "$VAR" = 1 ]; then
one branch ...
else # $input = "foo" && $VAR != 1
another branch...
fi
答案2
以下脚本将您的测试“由内而外”地转变为我们首先测试,然后根据$var
执行失败(;&
在 a 中使用) 。case
$input
我们这样做是因为是否“执行fallthrough”的问题实际上仅取决于$input
if $var
is 1
。如果它是任何其他值,则甚至不必询问是否进行失败的问题。
#/bin/bash
input='foo'
var='1'
case $var in
1)
case $input in
foo)
echo 'perform fallthrough'
;&
*)
echo 'fallthough worked'
esac
;;
*)
echo 'what fallthrough?'
esac
或者,没有case
:
if [ "$var" -eq 1 ]; then
if [ "$input" = 'foo' ]; then
echo 'perform fallthrough'
fi
echo 'fallthough worked'
else
echo 'what fallthrough?'
fi
答案3
我建议重组你的逻辑:将“fallthrough”代码放入函数中:
fallthrough() { echo 'fallthrough worked!'; }
for input in foo bar; do
for var in 1 2; do
echo "$input $var"
case $input in
foo)
if (( var == 1 )); then
echo "falling through"
fallthrough
else
echo "not falling through"
fi
;;
*) fallthrough;;
esac
done
done
输出
foo 1
falling through
fallthrough worked!
foo 2
not falling through
bar 1
fallthrough worked!
bar 2
fallthrough worked!
答案4
测试两个都一次变量(bash 4.0-alpha+):
#!/bin/bash
while (($#>1)); do
input=$1 VAR=$2
echo "input=${input} VAR=${VAR}"; shift 2
if [ "$VAR" = 1 ]; then new=1; else new=0; fi
case $input$new in
foo0) echo "do not perform fallthrough" ;;
foo*) echo "perform fallthrough" ;&
*) echo "fallthrough worked!" ;;
esac
echo
done
关于测试:
$ ./script foo 0 foo 1 bar baz
input=foo VAR=0
do not perform fallthrough
input=foo VAR=1
perform fallthrough
fallthrough worked!
input=bar VAR=baz
fallthrough worked!
干净简单。
了解测试值 ( $new
) 必须只有两个可能的值,这就是 if 子句存在的原因,将 VAR 转换为布尔值。如果 VAR 可以被设为布尔值,则测试 中的0
(不是1
)case
并删除if
。