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

これには2つの主な問題があります。

  • $(終了コードの代わりにコマンドから標準出力を取得します。
  • 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=$?

関連情報