为什么使用变量使用zsh更改echo的输出?

时间:2013-10-16 13:26:36

标签: bash zsh

作为输入,我有一个名为exp_multiple_512_0的文件,其中包含11行包含数字。我正在使用zsh。

如果我这样做:

echo $(cut -f1 exp_multiple_512_0)

我有:

0 100 200 300 400 500 600 700 800 900 1000

但是,如果我改变我的行:

v=$(cut -f1 exp_multiple_512_0) 
echo $v

我有:

0
100
200
300
400
500
600
700
800
900
1000

但是当我使用bash时,我仍然得到:0 100 200 300 400 500 600 700 800 900 1000

我的问题是:

  • 正确的行为应该是什么?保持或不回报?
  • 为什么使用中间变量可以让我保留回车?
  • 我可以将zsh配置为更像bash吗?

3 个答案:

答案 0 :(得分:1)

在echo中使用引号:

echo "$(cut -f1 exp_multiple_512_0)"

或简单地说:

cut -f1 exp_multiple_512_0

然后,当您进入第二个命令时,您将获得换行符。

没有shell周围的引号为换行符打印空间。

答案 1 :(得分:0)

最佳答案来自chepnet,他在评论中说:

  

zsh不会对参数扩展执行分词   默认值,意味着任何嵌入的换行符都是字面上的   作为单词分隔的空白。 setopt SH_WORD_SPLIT生成zsh   表现得像bash。问题在于echo $ v vs echo" $ v"而不是   $(削减......)。

答案 2 :(得分:-1)

如前所述@chepner,zsh的行为方式与bash不同。

尝试在不更改zsh行为的情况下使您的解决方案同时适用于zsh和bash。试一试,将echo $v更改为:

echo "$v" | tr '\n' ' '