0

作为输入,我有一个名为 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 吗?
4

3 回答 3

1

在你的回声中使用引号:

echo "$(cut -f1 exp_multiple_512_0)"

或者简单地说:

cut -f1 exp_multiple_512_0

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

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

于 2013-10-16T13:31:27.687 回答
0

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

zsh 默认情况下不对参数扩展执行分词,这意味着任何嵌入的换行符都按字面意思处理,而不是作为分词空格。setopt SH_WORD_SPLIT 使 zsh 表现得像 bash。问题在于 echo $v vs echo "$v",而不是 $(cut ...)。

于 2013-10-30T22:04:18.930 回答
-1

正如@chepner 之前提到的,zsh 的行为方式与 bash 不同。

这是在不改变 zsh 行为的情况下使您的解决方案同时在 zsh 和 bash 上工作的尝试。试一试,将您的更改echo $v为:

echo "$v" | tr '\n' ' '
于 2013-10-16T13:29:18.633 回答