在zsh命令中尾随空格

时间:2019-09-21 20:33:10

标签: bash zsh

我正在编写一个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一样在其命令中消除多余的空格吗?

2 个答案:

答案 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