我有以下大括号扩展(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"