我有以下脚本来检测重新启动路由器后网络重新启动的时间:
#!/bin/bash
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null"
while [[ ! $($pingCommand) ]]; do
sleep 3s;
done
然而,当在终端中运行时,它会打印:
ping:未知主机&> / dev / null
我使用-x
选项运行脚本(以启用调试)并找到
ping 192.168.1.1 -c 3 &>/dev/null
正在子shell中执行
ping 192.168.1.1 -c 3 '&>/dev/null'
如何更改命令替换调用,以便bash不会在输出重定向周围放置单引号?
答案 0 :(得分:7)
Don't store commands in variables. Use functions.他们处理重定向和管道而没有困扰变量的引用问题。
当您将所有输出重定向到/dev/null
时,尝试捕获ping的输出也没有意义。如果您只想知道它是否有效,请检查其退出代码。
pingCommand() {
ping 192.168.1.1 -c 3 &>/dev/null
}
while ! pingCommand; do
sleep 3s;
done
答案 1 :(得分:0)
使用eval
:
#!/bin/bash
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null"
# set -x # uncomment to see what's going on
while ! eval $pingCommand ; do
sleep 3s;
done
您不需要[[ ]]
(表达式评估)或$()
(输出捕获)。
当然,正如John Kugelman在另一个答案中所建议的那样,使用这些函数避免了与eval
相关的所有潜在陷阱。