我正在编写一个zsh脚本,该脚本从文件 gimp.gradients_set_active(<gradientName>) (which seems to have disappeared) or
pdb.gimp_context_set_gradient(<gradientName>)
捕获主机名,并通过ping通来确保它在网络上存在。以下是我的代码:
README
我注意到,如果HOSTNAME=$(cat README 2>/dev/null | grep -oP "^Host(name)*:[\s]+\K(.*)")
ping -w 5 -c 1 $HOSTNAME >/dev/null 2>&1
if [ $? != 0 ]; then
# error
else
# all good
fi
中包含主机名的行末尾有空格,则README
不起作用。例如,该行可能如下所示,其中我用ping
字符表示空白。
_
zsh不会像bash一样在其命令中消除多余的空格吗?
答案 0 :(得分:1)
您正在考虑word splitting的未引用变量,Bash does implicitly but Zsh doesn't。例如:
$ cat test.sh
var="foo bar"
printf '%s\n' $var
$ bash test.sh
foo
bar
$ zsh test.sh
foo bar
如果要在Zsh中进行分词,请使用$=var
。
顺便说一句,这是一个更简单的awk命令,可以避免问题(假设主机名不能包含空格):
HOSTNAME=$(awk '/^Host(name)?:/ {print $2}' README)
答案 1 :(得分:0)
您的变量 HOSTNAME
在尾端有一些空格。解决此问题的一种方法是strip leading/trailing whitespace from a parameter。
在这种情况下,您可以通过在 ping
命令上方添加一行来实现,如下所示:
之前
# Original line
ping -w 5 -c 1 $HOSTNAME >/dev/null 2>&1
之后
# Strip leading/trailing whitespace from $HOSTNAME
HOSTNAME=${(MS)HOSTNAME##[[:graph:]]*[[:graph:]]}
# Original line
ping -w 5 -c 1 $HOSTNAME >/dev/null 2>&1