我正在尝试将解析的 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