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
여부 에만 달려 있기 때문에 우리가 이렇게 하는 것입니다 . 만약 다른 값이었다면 진행할지 말지 고민할 필요도 없었을 것입니다.$var
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
)에는 가능한 값이 두 개만 있어야 하므로 VAR을 부울 값으로 변환하기 위해 if 절이 존재하는 이유입니다. VAR을 부울 값으로 설정할 수 있는 경우 테스트를 거쳐 0
(아님 1
) case
제거됩니다 if
.