在 Bash 脚本中检查命令的结果

art*_*iet 4 bash shell-script command-substitution

我目前正在阅读“高级 Bash 脚本指南”。有一些脚本在我的机器上无法正常工作:

HNAME=news-15.net # Notorious spammer.
# HNAME=$HOST
# Debug: test for localhost.
count=2 # Send only two pings.
if [[ `ping -c $count "$HNAME"` ]]
then
echo ""$HNAME" still up and broadcasting spam your way."
else
echo ""$HNAME" seems to be down. Pity."
fi
Run Code Online (Sandbox Code Playgroud)

它总是打印$HNAME" still up and broadcasting spam your way.- 即使 IP 地址不存在。有人可以澄清是什么问题吗?

当我使用主机名而不是 IP 地址时,它可以正常工作。

ilk*_*chu 10

if [[ `ping -c $count "$HNAME"` ]]
Run Code Online (Sandbox Code Playgroud)

ping在命令替换中运行(使用旧的反引号语法,而不是 saner $(...))。结果输出放在命令行上,然后[[ .. ]]测试输出是否为空。(即,常规输出。命令替换不会捕获错误输出,错误输出仍会发送到脚本的错误输出。)

如果ping输出任何内容,则测试成功。例如在我的系统上:

$ ping -c1 1.2.3.4 2>/dev/null
PING 1.2.3.4 (1.2.3.4) 56(84) bytes of data.

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
Run Code Online (Sandbox Code Playgroud)

由于1.2.3.4是有效的 IP 地址,请ping尝试联系它。如果 IP 地址无效或主机名不存在,它只会打印错误,并且标准输出将为空。

测试主机是否启动的更好方法是测试 的退出状态ping,并将其输出重定向:

host=1.2.3.4
if ping -c1 "$host" >/dev/null 2>&1; then
    echo "'$host' is up"
else
    echo "'$host' does not respond (or invalid IP address/hostname)"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,echo命令中的引用已关闭:

echo ""$HNAME" seems to be down."
Run Code Online (Sandbox Code Playgroud)

它有一个空的带引号的字符串"",然后是一个不带引号的参数扩展$HNAME,然后是带引号的字符串" seems to be down."。出于各种原因,最好引用所有参数扩展,因此请使用"$var blahblah", 或者"\"$var\" blahblah"如果您想在输出中的变量周围加上引号。

看: