0

我有以下脚本来检测我的网络在重新启动路由器后何时恢复:

#!/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 不在输出重定向周围加上单引号?

4

2 回答 2

7

不要将命令存储在变量中。使用函数。他们处理重定向和管道,而没有困扰变量的引用问题。

当您将所有输出重定向到/dev/null. 如果您只想知道它是否有效,请检查其退出代码。

pingCommand() {
    ping 192.168.1.1 -c 3 &>/dev/null
}

while ! pingCommand; do
   sleep 3s;
done
于 2016-05-12T13:31:40.223 回答
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.

于 2016-05-12T14:17:52.283 回答