명령을 실행하는 스크립트를 작성하려고 하는데 명령의 출력이 3이면 스크립트가 종료되어야 하고 3이 아니면 스크립트는 개수가 3이 아니라는 것을 알려주는 이메일을 보내야 합니다. 아래에 이 코드를 작성했는데 무슨 이유인지 실행할 때마다 출력이 3인데도 3이 아니라는 이메일이 옵니다.
#!/bin/bash
Server_Count=""
nslookup servers | grep -i "Address: 10" | wc -l > /dev/null
if [ $? == 3 ]; then
Server_Count="$?"
else
echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]
fi
답변1
$?
이전 명령의 결과가 아닌 이전 명령의 종료 코드입니다. 따라서 명령이 성공했다고 가정하면 $?
0이 됩니다.
명령 대체를 원합니다.
#!/bin/bash
server_count=$(nslookup servers | grep -i "Address: 10" | wc -l)
if [[ "$server_count" -ne 3 ]]; then
echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]
fi
server_count
이는 결과로 설정되므로 wc -l
if 문에서 다시 설정할 필요가 없습니다. 그래서 나는 if 검사를 무효화했습니다(서버가 중요하다면확실히이메일을 보내려면 3이고, 그렇지 않으면 아무 것도 하지 않습니다.)
여기서는 정수 비교에 대한 올바른 검사인 -ne
검사도 사용됩니다 .
참고로, [ ... ]
bash 비교 연산자와 함께 POSIX 쉘을 사용하여 테스트하고 있습니다 ==
. 이는 여전히 많은 시스템에서 작동하지만 를 사용할 때는 을 [ ... ]
사용해야 =
하고 를 사용할 때는 또는 을 [[ ... ]]
사용할 수 있습니다 .=
==
답변2
Jesse_b가 설명했듯이wc -l
, 반환된 데이터가 아니라 반환 상태를 보고 있기 때문에 코드가 작동하지 않습니다 .
if nslookup servers | grep -c -iF "Address: 10" | ! grep -q -xF 3; then
echo 'Server count is not 3... please check' | mail -s 'Server count issue' [email protected]
fi
이렇게 하면 주어진 string과 일치하는 출력의 줄 수를 계산하여 변수에 항목을 저장할 필요가 없으며 nslookup
, 해당 개수가 정확히 3개가 아닌 경우 이메일을 보냅니다.
를 사용하면 -c
주어진 grep
패턴과 일치하는 줄 수를 출력합니다. grep의 출력 생성을 -q
중지하는 옵션입니다 grep
. 여기서는 grep
일치하는 항목이 있는지 여부만 고려 3
하고 반환 상태로 확인합니다. -x
전체 줄을 강제로 일치시킵니다(즉, 일치하지 않고만 일치 시킵니다 3
) 30
. 이 -F
옵션을 사용하면 grep
정규식 일치 대신 문자열 일치가 활성화됩니다.