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"
如果您想在输出中的变量周围加上引号。
看: