조건이 항상 true인 경우 Bash 스크립트

조건이 항상 true인 경우 Bash 스크립트

아이싱을 위한 이벤트 핸들러를 만들려고 합니다. 내 Bash 스크립트는 이제 다음과 같습니다.

#!/bin/bash
# Event Handler for loggin out inactive RDP users

# $1 is $SERVICESTATE$ (OK WARNING UNKNOWN CRITICAL)
# $2 is $SERVICESTATETYPE$ (SOFT HARD)
# $3 is $SERVICEATTEMPT$ (1 through 4)
# $4 is $SERVICDOWNTIME$ (0 no Downtime, >0 Downtime active)
# $5 is SRV29 
# $6 is $host.name$ (1 through 4)


if  [ "$4" > 0 ];
 echo "in downtime, exit";
 then exit
fi

case "$1" in
OK)
echo "ok!"
;;
WARNING)
echo "warning!"
;;
UNKNOWN)
echo "unknown!"
;;
CRITICAL)
echo "critical!"
...

상단에 if 문 없이 이 스크립트를 실행하면 모든 것이 잘 작동합니다. 하지만 $4가 0보다 큰지 확인하고 싶습니다. 이 테스트 조건은 항상 true를 반환하며, 이 조건에 무엇을 입력하든 항상 "중지, 종료" 결과가 발생합니다.

그래서 심지어 if [ "hello" = "hallo" ]즉시 들어오고 나갈 것입니다. 나는 또한 따옴표, 이중 괄호 등을 사용하지 않고 따옴표를 사용하여 거의 모든 변형을 시도했습니다. 나는 분명히 뭔가 잘못하고 있습니다. 누구든지 그것을 알아낼 수 있습니까?

미리 감사드립니다!

답변1

정수를 테스트하려면 다음을 사용해야 합니다.

-eq  #Is equal
-ne  #Is not equal
-lt  #Less than
-le  #Less than or equal
-gt  #Greater than
-ge  #Greater than or equal

따라서 test선언은 다음과 같아야 합니다.

if  [ "$4" -gt 0 ];

또한 귀하의 if진술이 누락되었으므로 then다음과 같이 수정해야 합니다.

if  [ "$4" -gt 0 ]; then

man test추가 옵션 은 리소스를 참조하세요 test.

답변2

귀하의 if진술은 모두 번복되었습니다.

if [ "$4" -gt 0 ]; then
   # stuff to do when $4 > 0
else
   # stuff to do when $4 <= 0
fi

답변3

if  [ ... ];
    echo "in downtime, exit";
    then exit
fi

다른 답변에서 언급했듯이 then이 경우 키워드가 잘못된 위치에 있습니다 if. (셸 언어 관점에서 보면 손실된 것이 아닙니다. 손실된 경우 구문 오류가 발생합니다.)

여기서 무슨 일이 일어나고 있는지둘 다이전 명령은 then조건의 일부로 간주되며 전체 명령의 반환 값을 사용하여 다음 부분의 then실행 여부를 선택합니다. 세미콜론으로 구분된 명령의 경우 마지막 명령의 종료 상태만 중요합니다.

echo성공은 항상 가능하므로 조건부 분기는 항상 실행됩니다 . 그러나 그런 것은 if true; false; then echo something; fi결코 실행되지 않습니다 echo. then실수로 키워드 사이에 내용을 추가하는 것을 방지하려면 키워드를 조건과 같은 줄에 배치하는 것이 좋습니다 .

if조건부로 여러 명령을 사용하는 것은 혼란스러울 수 있지만 while이를 사용하면 다음과 같은 용도가 있을 수 있습니다.

while value=$(somecommand) ; [ "$value" != 0 ] ; do
    echo "do some work with $value"
done

할당과 테스트는 모두 루프가 반복될 때마다 실행됩니다.

관련 정보