[bash] 쉘 if 문에서 여러 조건을 나타내는 방법은 무엇입니까?
다음과 같은 여러 조건을 나타내고 싶습니다.
if [ ( $g -eq 1 -a "$c" = "123" ) -o ( $g -eq 2 -a "$c" = "456" ) ]
then
echo abc;
else
echo efg;
fi
하지만 스크립트를 실행하면
syntax error at line 15: `[' unexpected,
15 행은 다음과 같은 경우를 보여줍니다.
이 상태에 어떤 문제가 있습니까? 에 문제가있는 것 같습니다 ()
.
답변
고전적인 기술 (메타 문자 이스케이프) :
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
나는에 대한 참조 동봉 한 $g
따옴표를; 일반적으로 좋은 습관입니다. 의 우선 순위 때문에 엄밀히 괄호가 필요하지 않습니다 -a
및 -o
차종은 심지어 그들없이 수정합니다.
것을 주 -a
및 -o
운영자에 대한 POSIX 사양의 일부 test
일명, [
주로 (그들은의 한 부분 이었기 때문에 이전 버전과의 호환성을 위해, test
예를 들어, 7 판 UNIX에서)하지만, 명시 적으로 POSIX에 의해 ‘퇴화’로 표시됩니다. 배쉬 (참조 조건식 )에 대한 고전과 POSIX 의미를 선점 할 것으로 보인다 -a
및 -o
인수를 자신의 다른 사업자와 함께.
약간의주의를 기울이면보다 현대적인 [[
연산자를 사용할 수 있지만 Bash와 Korn Shell의 버전이 동일 할 필요는 없습니다.
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
Mac OS X에서 Bash 3.2.57을 사용하는 예제 실행 :
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
변수 는 동일한 방식으로 별도의 명령이 아니기 때문에 변수를 인용 [[
할 필요 [
가 없습니다 [
.
고전적인 질문 아닌가요?
나는 그렇게 생각했을 것입니다. 그러나 다른 대안이 있습니다.
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
실제로 autoconf
도구 또는 관련 패키지에 대한 ‘휴대용 쉘’지침을 읽으면 ‘ ||
‘및 ‘ &&
‘을 사용한이 표기법이 권장됩니다. 나는 당신이 심지어까지 갈 수 있다고 생각합니다 :
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
동작이 에코처럼 사소한 경우에는 나쁘지 않습니다. 반복 할 동작 블록이 여러 줄인 경우 반복이 너무 고통스럽고 이전 버전 중 하나가 선호되거나 동작을 다른 then
블록 에서 호출되는 함수로 래핑해야합니다 .
답변
배쉬에서 :
if [[ ( $g == 1 && $c == 123 ) || ( $g == 2 && $c == 456 ) ]]
답변
/bin/bash
다음을 사용 하면 작동합니다.
if [ "$option" = "Y" ] || [ "$option" = "y" ]; then
echo "Entered $option"
fi
답변
문자열 변수에 공백이 있고 존재 여부를 확인하면주의하십시오. 그것들을 올바르게 인용하십시오.
if [ ! "${somepath}" ] || [ ! "${otherstring}" ] || [ ! "${barstring}" ] ; then
답변
$ g=3
$ c=133
$ ([ "$g$c" = "1123" ] || [ "$g$c" = "2456" ]) && echo "abc" || echo "efg"
efg
$ g=1
$ c=123
$ ([ "$g$c" = "1123" ] || [ "$g$c" = "2456" ]) && echo "abc" || echo "efg"
abc
답변
문자열 비교를 위해 bash에서 다음 기술을 사용할 수 있습니다.
if [ $var OP "val" ]; then
echo "statements"
fi
예:
var="something"
if [ $var != "otherthing" ] && [ $var != "everything" ] && [ $var != "allthings" ]; then
echo "this will be printed"
else
echo "this will not be printed"
fi
답변
#!/bin/bash
current_usage=$( df -h | grep 'gfsvg-gfslv' | awk {'print $5'} )
echo $current_usage
critical_usage=6%
warning_usage=3%
if [[ ${current_usage%?} -lt ${warning_usage%?} ]]; then
echo OK current usage is $current_usage
elif [[ ${current_usage%?} -ge ${warning_usage%?} ]] && [[ ${current_usage%?} -lt ${critical_usage%?} ]]; then
echo Warning $current_usage
else
echo Critical $current_usage
fi