为什么/什么时候bash删除尾随换行符

时间:2017-06-28 11:07:21

标签: bash shell unix

bash何时或如何删除以下示例中的尾随换行符?

echo -n "$(echo foo)" | wc -c # why is this 3 not 4

a="$(echo foo | tail -c 1)" # why is $a empty and not "\n"

2 个答案:

答案 0 :(得分:3)

来自https://manpages.debian.org/stretch/bash/bash.1.en.html#Command_Substitution

  

Bash通过在子shell环境中执行命令并使用命令的标准输出替换命令替换来执行扩展,并删除任何尾随换行符。

此行为也由POSIX指定:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03

答案 1 :(得分:0)

  1. 默认情况下,echo会在字符串中添加换行符。
  2. 例如,echo'foo'给出了foo,并在最后添加了一个新的行字符。这就是shell提示符(可能是$)出现在新行中的原因。

    $echo 'foo'
    foo
    $
    

    如果使用wc -c进行管道传输,则会产生4,因为也会计算尾随新行字符

    $echo 'foo' | wc -c
    4
    $
    

    如果-n选项与echo一起使用,则会禁止使用默认尾随换行符,并且shell提示符会出现在同一行中。 如,

    $echo -n 'foo'
    foo$
    

    现在,如果通过wc -c计算字符数,则它给出3,因为没有尾随的新行字符。

    $echo -n 'foo' | wc -c
    3
    

    出于同样的原因, echo -n "$(echo foo)" | wc -c为3而不是4,因为-n会抑制如果未使用-n则会出现的新行字符。 如果-n将被删除,您将获得4作为答案。

    1. a="$(echo foo | tail -c 1)" 我可以看到,echo $a给出一个空的空白行,然后在该shell后面提示$,这意味着$ a有\ n表示一个新的空白行。
    2. 这是预期和完美的。

      如果没有\ n是$ a,则shell提示符$将出现在连续行中,并且不会出现空白行。