【问题标题】:Trailing whitespace in zsh commandszsh 命令中的尾随空格
【发布时间】:2019-09-21 20:33:10
【问题描述】:

我正在编写一个 zsh 脚本,它从文件 README 中捕获主机名,并通过 ping 确保它存在于网络上。以下是我的代码:

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 就不起作用。例如,该行可能如下所示,其中我用 _ 字符表示空白。

Hostname:____bobscomputer_

zsh 不会像 bash 那样去除命令中多余的空格吗?

【问题讨论】:

    标签: bash zsh


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      您的变量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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        相关资源
        最近更新 更多