如何在不发出换行符的情况下打印“ -n”?


16

我正在尝试-n使用echo命令进行打印。但是,如果我只是键入echo -n,它只会发出换行符,而不会显示-n,而是发出换行符。


是否echo -n -- -n有效(没有方便测试的Linux盒)?
n0rd

我正在虚拟机中安装Ubuntu,这看起来非常慢,请稍等。
Star OS

1
我已经检查过-没有。可能是因为它是内部bash命令,并且没有使用getopt(???)来解析命令行
n0rd

1
这个问题是问和回答pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - “符合应用程序...可能被期待回声-n,应使用从第九届衍生工具的printf版系统”
布兰登2015年

我提出的第一个热门问题。好极了?
Star OS

Answers:


28

问题是将echo解释-n为参数。在默认的bash实现中,这意味着(来自help echo):

  -n  do not append a newline

有多种解决方法:

  1. 通过包含其他字符,将其变为不可选项。例如,告诉echo不要使用来打印换行符-n,然后告诉它使用来解释反斜杠转义-e符并显式添加换行符。

    $ echo -ne '-n\n'
    -n
  2. 或者,只需添加一个空格

    $ echo " -n"
     -n

    但是,这会增加您可能不想要的空间。

  3. 在其前面使用非打印字符。这里。我正在使用退格键(\b

    $ echo -e "\b-n"
    -n

    这还会增加您可能不想要的额外字符。

  4. 使用骗术

    $ echo n- | rev
    -n

    rev命令仅将其输出反向打印。

  5. 使用正确的工具完成工作

    $ printf -- '-n\n'
    -n

您正确的认为任何有效的字符都可以。
试点

@ Pilot6是的,但是这种方法(您和我的)的问题是它增加了一个额外的字符。这可能会导致问题。尤其是如果您随后要解析它并尝试类似grep '^-n'pritnf确实是要走的路。
terdon

好吧,printf反正还是更好,但是问题是关于echo
飞行员

2
看起来echo -e "-n\c"确实很准确。
飞行员

1
\c被抑制进一步输出
Pilot6


7

您可以使用此命令,但是会增加额外的空间。

echo -e  "\r-n"

这是一种hack。

-e 启用反斜杠命令符号。

\r 是回车。

实际上,任何\有效字符都可以在字符串的任何位置使用。

您可以通过看到哪些有效help echo

echo "-n"无法-n使用,因为它用作的参数echo

PS恕我直言最好的解决方案是

echo -e "-n\c"

它不会添加任何额外的字符

echo -e "-n\n"

打印相同,但换行符为char。


1
哇!这比我的好。您能为“初学者”解释一下吗?
Sadi

谢谢,我也注意到,无论在开头还是结尾添加回车符都无关紧要。
Sadi 2015年

@Sadi是的,这是因为添加任何内容使其成为无效选项。-n是有效的,-nfoo不是这样,将被打印出来。
terdon

@terdon man echo也有。但是help好一点。
飞行员

我知道它有,只是不相关。/bin/echo是完全不同的事情,当您echo在bash中运行时,您将获得内置的内容,具体取决于您的shell。
terdon

5

我认为,如果您绝对只想使用echo,这将使您满意:

echo "-n "

之所以-n有效,是因为while 是的有效选项echo-n后面没有空格。由于这不是一个选项,因此echo只需打印即可。


这里的大多数观看者可能只想要“ -n”,而不想要“ -n”。
Star OS

5

你们真的想得太多了。

 echo -e \\055n

或没有尾随换行符

 echo -en \\055n

怎么printf "-n\n" 想得太多?
德米特里·格里戈里耶夫

是的,我只是这样回答。将删除我的答案。这是相对可移植的,因为它可以与内置的echo一起使用,/bin/echo并且至少可以通过以下方式调用:echo -e "\055n"
abligh 2015年

-en不是我想要的。
Star OS

2

为了扩展@AB的答案,唯一可移植的使用方式echo是避免使用任何选项-n。考虑printf在可用的地方使用代替。该参考页提供了更多详细信息,并很好地说明了何时,如何echo以及printf应使用它们:

如今,echo(1)仅在省略标志和转义序列时才可移植。如果您需要的不仅仅是纯文本,请使用printf(1)。


我要扩展答案,请编辑答案。
Star OS

我不确定将别人的答案更改为某个点,以使我收到的文字多于原作者的文字。
德米特里·格里戈里耶夫

2

在Bash脚本中,您可以运行:

echo -n -
echo n

或在交互外壳中:

echo -n - ; echo n

echo是一个-字符和一个n字符。


你试过了吗?这是错误的。
飞行员


第一命令输出-pilot6@Pilot6:~$。第二个输出n
飞行员

@ Pilot6取决于您是在交互式终端中运行还是在bash脚本中运行它(问题中未指定)。OTOH如果您在终端中需要它,将两行结合起来很简单&&-我真的不会说这个答案是错误的
user12205

我将对其进行编辑,以使其更加清晰,这是针对bash脚本的。
Star OS

1

其他三种方式:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n

0

你可以跑

printf -n;echo

在Busybox Ash中经过测试


灰?灰?宠物小精灵,我的意思是什么?
Star OS

我跑'的busybox灰'
jiwopene

说“ Busybox”或“ Busybox Ash”。人们不仅会想到“火山灰”,还可能会想到那个宠物小精灵角色或火山中的*******灰烬。
Star OS

更好。alt255alt255
Star OS

@StarOS ash是Almquist Shell的名称。
muru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.