셸 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
예를 들어 7th Edition UNIX)에서는 POSIX에 의해 'obsentle'로 명시적으로 표시됩니다.Bash(조건부 표현식 참조)는 고전적인 의미와 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
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
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
#!/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
두 가지 이상의 조건을 연결할 수도 있습니다.
if [ \( "$1" = '--usage' \) -o \( "$1" = '' \) -o \( "$1" = '--help' \) ]
then
printf "\033[2J";printf "\033[0;0H"
cat << EOF_PRINT_USAGE
$0 - Purpose: upsert qto http json data to postgres db
USAGE EXAMPLE:
$0 -a foo -a bar
EOF_PRINT_USAGE
exit 1
fi
언급URL : https://stackoverflow.com/questions/3826425/how-to-represent-multiple-conditions-in-a-shell-if-statement
'programing' 카테고리의 다른 글
OSX 10.7 Lion으로 업그레이드한 후 Postgresql 복구 (0) | 2023.05.21 |
---|---|
Node.js 프로젝트의 폴더 구조 (0) | 2023.05.21 |
연결 uri / url과 함께 pg_dump를 사용하는 방법은 무엇입니까? (0) | 2023.05.21 |
Xcode iOS 프로젝트는 "My Mac 64-bit"만 표시하고 시뮬레이터나 장치는 표시하지 않습니다. (0) | 2023.05.21 |
req.포스트에 비어있는 본문 (0) | 2023.05.21 |