"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 脚本中不起作用,它将被输出到屏幕上。 -ezsh 中不需要。 -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转义字符。 \cC光标带回到当前行。

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 脚本中任何行的替代方法吗?

php怎么输出打印

猛击-里诺米娜.sh

Linux 下system ("stty -echo")是啥意思

php,echo _FILE_;结果直接打印出_FILE_