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检查名称与 in 中的数据匹配的命令是否$bool返回 0,而不是 bool 是否为 0 或 1。也就是说,如果$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=$?

相关内容