如何在不换行的情况下使用“echo”输出内容?

113

我有以下代码:

for x in "${array[@]}"
do
  echo "$x"
done
结果大致如下(在某些情况下会稍后排序):
1
2
3
4
5
有没有办法将其打印为1 2 3 4 5而不是每次都添加一个新行?

那会稍微棘手一些来排序。 - melpomene
附注:http://shellcheck.net/是你的好朋友。 - Charles Duffy
1
顺便说一下,这就是为什么我们要求问题包含一个最小的、完整的、可验证的示例的一部分——为了使其完整和可验证,它需要包括实际值的数组,以重现问题作为问题的一部分,这意味着在弄清楚您的实际问题之前,我们不会摸索;请参见http://stackoverflow.com/help/mcve。 - Charles Duffy
@CharlesDuffy 我原本就是这么做的... - ricky162
1
规范的写法是*"echo -n" prints "-n"*。 - Peter Mortensen
显示剩余8条评论
5个回答

207

是的。使用-n选项:

echo -n "$x"

来自 help echo:

-n 不附加新行符

这也会去掉最后一个换行符,所以如果需要,您可以在循环之后添加最后的换行符:

for ...; do ...; done; echo

注意:

这并不适用于各种不同实现的echo内置/外部可执行文件。可移植的方法是使用printf代替:

printf '%s' "$x"

4
谢谢,它只是在每个数字前打印出“-n”。 - ricky162
2
echo 方法放在可移植方法之前有什么原因吗? - Charles Duffy
@CharlesDuffy,由于原帖已经在使用echo,所以我首先考虑了这个选项。 - heemayl
2
@ricky162,如果您看到的行为与此不同,则必然存在其他问题--例如数据不代表您在问题中输入的内容;例如嵌入数组主体中的换行符文本。 - Charles Duffy
1
@ricky162 你是用 sh 运行脚本而不是 bash 吗?用 bash 运行可以正常工作,但用 sh 运行会打印出字面上的 -n。 - lilalinux
显示剩余2条评论

10
printf '%s\n' "${array[@]}" | sort | tr '\n' ' '

printf '%s\n'echo 更加健壮,而且这里需要换行符以便于 sort 使用。 "${array[@]}" 对于您的特定数组来说不需要引号,但好的习惯是在那里不使用单词拆分和全局扩展。


5

您不需要使用 for 循环来对数组中的数字进行排序。

可以像这样使用进程替换:

sort <(printf "%s\n" "${array[@]}")

要去除换行符,请使用以下方法:

sort <(printf "%s\n" "${array[@]}") | tr '\n' ' '

4

如果出现问题,无论什么原因,-n 不能解决问题,你也可以在要输出的内容末尾添加 \c

echo "$x\c"

这个和 echo -n 一样不太可移植,而且支持度更少。 - tripleee
谢谢,但我在某些情况下尝试了“-n”,但它没有起作用。这是我能让它工作的唯一方法。 - Edward Loveall
1
@tripleee 实际上,echo -n 根本不是可移植的:https://unix.stackexchange.com/tags/echo/info - 简而言之:在某些系统上,特别是在 MacOS "sh" 上,echo -n 实际上会打印 -n。这个答案是一个有效的选项。 - lzap
@lzap,这正是我所说的。应该避免使用这两种方法,而应该选择正确可移植且更加灵活多变的printf方法。 - tripleee

2
你也可以这样做:
array=(1 2 3 4 5)
echo "${array[@]}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接