명령의 출력이 "3"인지 확인하는 스크립트를 작성하세요.

명령의 출력이 "3"인지 확인하는 스크립트를 작성하세요.

명령을 실행하는 스크립트를 작성하려고 하는데 명령의 출력이 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 -lif 문에서 다시 설정할 필요가 없습니다. 그래서 나는 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정규식 일치 대신 문자열 일치가 활성화됩니다.

관련 정보