分配的变量具有 nslookup 和 ping 命令的空输出

分配的变量具有 nslookup 和 ping 命令的空输出

我正在尝试将解析的 IP 地址分配给变量:

ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) | echo $ip

或者

ip=`resolveip google.com | head -n 1` | echo $ip

两个 echo 都返回空输出。不将其分配给变量命令效果很好。我做错了什么?

答案1

$ip您想要实现的目标似乎是在将命令的输出分配给shell 变量后输出它的内容ping- 这意味着您想要第一的将命令输出分配给变量,并且然后在控制台上打印结果变量内容。

但是,您正在使用管道 ( |) 运算符来链接这两个命令。这是错误的操作符,原因有两个。

  • 首先,该运算符用于将一个命令的输出重定向到另一个命令的输入;然而,变量赋值不会产生输出,并且该echo命令不会从stdin.虽然这不是问题的根本原因,但当|以非预期方式使用运算符时,您可能会在更复杂的情况下遇到问题。
  • 更严重的是(也可能是观察到的行为的实际原因),这种管道两端的命令同时启动,以便接收命令可以“即时”处理发送命令的输出(特别是,不需要缓冲整个输出)。在您的情况下,这意味着该echo $ip命令会立即执行,并且很可能在 shell 有时间用ping.

因此,这两个问题的解决方案是使用;相反 来简单地顺序执行两个仅恰好写在同一行上的命令:

ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) ; echo $ip

相关内容