基于 if 条件的案例失败

基于 if 条件的案例失败

我正在寻找一种根据 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

在上面的代码中,如果变量VAR1,我想让 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”的问题实际上仅取决于$inputif $varis 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(不是1case并删除if

相关内容