大括号扩展中不需要的空间

大括号扩展中不需要的空间

我有以下大括号扩展(bash shell):

echo -e {0..4..2}" "{0..2..2}"\n"

我预计这会产生

0 0
0 2
2 0
2 2
4 0
4 2

但除了第一行之外,输出的每一行都有一个前导空格,并且末尾有一个额外的空行,这是我没想到的。为什么是这样。有没有简单的方法可以修复它?显然我可以做一些笨重的事情,比如管道到sed 's/^ //',但是有没有更漂亮的方法而不需要管道到额外的命令?

答案1

echo打印以空格分隔的参数,即使它们包含(或生成)换行符。此外,它会在其输出末尾添加一个换行符(除非它是echo -n)。

使用printf

printf '%s\n' {0..4..2}" "{0..2..2}

什么时候echo会发生意想不到的事情,总是考虑printf。当你熟悉之后,printf它甚至可能成为你的首选。

答案2

你得到一个空格的原因是每行的开头都很复杂。该echo命令输出其参数,并用空格分隔。每个参数都由一个扩展组成{0..4..2}{0..2..2}后跟一个换行符。当您将这两者放在一起时,您会发现每行开头的空间实际上是echo项目之间发出的空间。

我想到了几个解决方案。第一个是,如果您不介意在输出的开头有一个空行,您可以将换行符放在每个扩展的开头,

echo -e "\n"{0..4..2}" "{0..2..2}

另一种方法是循环遍历参数并单独打印它们

for seq in {0..4..2}" "{0..2..2}; do echo "$seq"; done

或者

echo -e {0..4..2}"\n"{0..2..2} | xargs printf "%d %d\n"

相关内容