Grep의 부울 문제

Grep의 부울 문제
        whois=`whois 100.43.81.149`
        bool="$(printf %s\\n "$whois" | grep -q netname:)"
        if $bool;
            then
                echo "netname: is available"    
            else
                echo "netname: is not available"            
        fi

whois명령 정보를 whois변수 에 저장 하려고 합니다 . 그런 다음 해당 변수에서 netname:문자열을 검색 하고 결과를 bool변수에 저장합니다.

하지만 이 경우에는 있어서는 안 되는 변수임에도 불구하고 bool변수는 항상 대소문자가 적용됩니다 .true

이 문제의 원인은 무엇입니까?

답변1

여기에는 두 가지 주요 문제가 있습니다.

  • $(종료 코드 대신 명령에서 표준 출력을 가져옵니다.
  • if $bool이름이 데이터와 일치하는 명령이 $boolbool이 0인지 1인지 여부 대신 0을 반환하는지 확인합니다. 즉, $bool"foo"가 포함되어 있으면 "foo" 명령이 실행됩니다.

직접 확인해보세요:

if whois 100.43.81.149 | grep -q netname:; then
    ...
fi

직접 실행하는 대신 종료 코드를 저장해야 하는 경우 [ -eq ,.. ]POSIX가 아닌 것을 사용하세요 ((.

whois 100.43.81.149 | grep -q netname:
netname_exists=$?

if (( netname_exists == 0 )); then  # Non-POSIX
if [ "$netname_exists" -eq 0 ]; then  # POSIX

나중에 사용하기 위해 출력을 저장해야 하는 경우 whois다음을 수행할 수 있습니다.

whois_data=$(whois 100.43.81.149)
printf '%s\n' "$whois_data" | grep -q netname:  # or use <<< (non-POSIX) or <<
netname_exists=$?

관련 정보