아이싱을 위한 이벤트 핸들러를 만들려고 합니다. 내 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
할당과 테스트는 모두 루프가 반복될 때마다 실행됩니다.