조건이 실패하는 경우를 기반으로 한 사례

조건이 실패하는 경우를 기반으로 한 사례

bash의 케이스 조건 내의 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

답변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를 수행"할지 여부에 대한 질문은 실제로 is $input여부 에만 달려 있기 때문에 우리가 이렇게 하는 것입니다 . 만약 다른 값이었다면 진행할지 말지 고민할 필요도 없었을 것입니다.$var1

#/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)에는 가능한 값이 두 개만 있어야 하므로 VAR을 부울 값으로 변환하기 위해 if 절이 존재하는 이유입니다. VAR을 부울 값으로 설정할 수 있는 경우 테스트를 거쳐 0(아님 1) case제거됩니다 if.

관련 정보