"echo -n" 打印 "-n"
Posted
技术标签:
【中文标题】"echo -n" 打印 "-n"【英文标题】:"echo -n" prints "-n" 【发布时间】:2012-06-26 22:51:24 【问题描述】:我的脚本中有echo
的问题:
echo -n "Some string..."
打印
-n Some string...
然后移动到下一行。在控制台中,它可以在没有换行符的情况下正常工作:
Some string...
【问题讨论】:
您使用的是哪个 bourne shell 实现?如果我在 bourne shell 模式下运行bash
,它在这里工作正常。此外,您不太可能真的使用 bourne shell 作为交互式 shell,不是吗?
在 Ubuntu 上:echo -ne "text without new line: "; echo "some text";
我知道这已经很老了,但这在 Windows 10 中对我有用,添加一个没有换行符的句点:echo |设置 /p="."
【参考方案1】:
echo
命令有多个版本,具有不同的行为。显然,用于您的脚本的 shell 使用的版本无法识别 -n
。
printf
命令的行为更加一致。 echo
适用于echo hello
之类的简单事物,但我建议将printf
用于更复杂的事物。
您在什么系统上,您的脚本使用什么外壳?
【讨论】:
从#!/bin/bash
行开始,它起作用了。通常我正在使用 bash。
我希望在 CMD 中有一个等效的 Windows :( 据我所知,没有,只是实现相同行为的解决方法。
@kayleeFrye_onDeck:也许有一个 Windows 版本的 printf
命令。
我希望。 echo
总是添加换行符...解决方法充其量是 jenky。
@alper %
是你的 shell 提示符。试试这个,仔细观察:printf hello; sleep 5
【参考方案2】:
bash
有一个名为“echo”的“内置”命令:
$ type echo
echo is a shell builtin
此外,还有一个“echo”命令,它是一个正确的可执行文件(即,shell fork 和 execs /bin/echo
,而不是解释 echo
并执行它):
$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21 2011 /bin/echo
echo
相对于\c
和-n
的行为各不相同。最好的办法是使用printf
,它可用于我查看的四种不同的 *NIX 风格:
$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
【讨论】:
这是一个重要的答案,因为它有助于区分作为命令的 echo 和作为可执行文件的 echo,这在编写脚本时不一定很明显。这意味着,如果您真的想获得您习惯的回显的默认行为,您可以确保使用可执行文件,通过使用/bin/echo -n
来获得无换行符显示。 printf
可能是更好的选择,但如果您习惯使用 echo,您仍然可以通过这种方式获得您期望的功能。【参考方案3】:
试试
echo -e "Some string...\c"
它按预期对我有用(正如我从你的问题中理解的那样)。
请注意,我从man
页面获得了此信息。 man
页面还指出,shell 可能有自己的echo
版本,我不确定bash
是否有自己的版本。
【讨论】:
+1 用于提示我正确的方向,尽管无法识别 -ne 选项的 echo 可能也无法识别 -e (也不需要)选项,因此您可能只想说echo "some string...\c"
反而。但是,如果您需要使用差异很大的 echo 命令支持多个 bash 变体,您可能最好使用 printf 或者您需要使用 [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"
之类的东西检查 echo 命令功能(至少 bash 也支持 \c,所以不需要使用 -n 选项,但你需要 -e 用于 bash)
对我来说,这正是 -n 在 OP 的情况下所做的:输出文字 -e。我猜 printf 确实更一致
-e 在 posix shell 脚本中不起作用,它将被输出到屏幕上。
-e
在zsh
中不需要。 -n
(没有新行)有效。为什么不使用zsh
并留下其他shell?【参考方案4】:
为了实现这一点,我经常使用两种方法:
1. 使用 光标 转义字符 (\c
) 和 echo -e
示例:
for i in 0..10..2; do
echo -e "$i \c"
done
# 0 2 4 6 8 10
-e
标志启用字符串中的 E转义字符。
\c
将 C光标带回到当前行。
或
2.使用printf
命令
示例:
for ((i = 0; i < 5; ++i)); do
printf "$i "
done
# 0 1 2 3 4
【讨论】:
【参考方案5】:如果您在 if 中将 echo 与其他命令一起使用,例如“read”,它可能会忽略该设置,并且无论如何都会跳转到新行。
【讨论】:
【参考方案6】:仅适用于 most popular Linux distribution、Ubuntu 及其 Bash:
检查您使用的是哪个外壳。主要是以下工作,否则see this:
echo $0
如果上面打印bash
,那么下面会起作用:
printf "hello with no new line printed at end"
或者
echo -n "hello with no new line printed at end"
【讨论】:
【参考方案7】:enable -n echo
echo -n "Some string..."
【讨论】:
解释一下。例如,想法/要点是什么?它尝试了哪个版本的 Bash?在什么操作系统上(包括例如 Linux 发行版和版本)?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。【参考方案8】:我相信现在你的输出打印如下
~ echo -e "String1\nString2"
String1
String2
您可以使用xargs 将多行标准输出放入同一行。
~ echo -e "String1\nString2" | xargs
String1 String2
~
【讨论】:
【参考方案9】:请注意,AIX 上的 /usr/bin/echo 和 /bin/echo 不支持任何参数,因此 -n如果使用 sh 或 KornShell (ksh
) shell,则 em> 和 -e 都不起作用。
C shell 和Bash 有自己的内置echo 支持-n。 这是相关的,因为许多 shell 脚本明确使用 sh 或 KornShell。
AIX 确实有 /usr/bin/printf,所以正如之前一些答案中所建议的那样,
$ printf "whatever"
相当于echo -n "whatever"
,其中支持-n。
【讨论】:
【参考方案10】:当你编写你的 shell 脚本时,总是使用#!/usr/bin/env bash
作为第一行。
此 shell 不会省略或操作转义序列。
例子:
echo "This is first \\n line"
打印
This is first \n line.
【讨论】:
#!/usr/bin/env bash
的解释在 What is the difference between "#!/usr/bin/env bash" and "#!/usr/bin/bash"? 中。【参考方案11】:
我在 IBM z/OS 遇到了同样的问题,所以我使用 print 而不是 echo,并且成功了。
print -n "Some string ...."
print — Return arguments from the shell
【讨论】:
以上是关于"echo -n" 打印 "-n"的主要内容,如果未能解决你的问题,请参考以下文章
php中echo ("Y-m-d H:i:s"); echo ('Y-m-d H:i:s');为啥单双引号都能打印时间?
在 hql 脚本中,我们使用 "!sh echo ---new line---" 来表示相同的 .想知道在 impala 中打印 impala 脚本中任何行的替代方法吗?