在shell脚本中没有换行符的'echo'


540

echo我的脚本有问题:

echo -n "Some string..."

版画

-n Some string...

并移至下一行。在控制台中,它不需要换行就可以正常工作:

Some string...

2
您正在使用哪个bourne shell实现?如果我bash以bourne shell模式运行,则在这里工作正常。而且,您不太可能真正使用bourne shell作为交互式shell,不是吗?
FatalError 2012年

4
在Ubuntu上:echo -ne "text without new line: "; echo "some text";
zsoltii

我知道这很老了,但这在Windows 10中对我有用,可以添加一个不带换行符的句点:设置/ p =“。”
SPlatten

Answers:


571

echo命令有多个版本,具有不同的行为。显然,用于脚本的Shell使用的版本无法识别-n

printf命令具有更一致的行为。echo对于诸如之类的简单事情也可以echo hello,但我建议printf对更复杂的事情使用。

您在什么系统上,脚本使用什么外壳?


46
从生产线开始,#!/bin/bash它就起作用了。通常我正在使用bash。
qwertz 2012年

我希望有一个Windows相当于在CMD :(据我所看到的,是不是,只是变通方法来达到同样的行为。
kayleeFrye_onDeck

2
@kayleeFrye_onDeck:也许有Windows版本的printf命令。
基思·汤普森

我希望。echo总是添加换行符...解决方法充其量是充其量。
kayleeFrye_onDeck

2
@alper这%是您的shell提示符。试试看,并仔细观察:printf hello; sleep 5
基思·汤普森

150

bash 有一个名为“ echo”的“内置”命令:

$ type echo
echo is a shell builtin

另外,还有一个“ echo”命令,该命令是适当的可执行文件(即,与/bin/echo解释echo和执行命令相反,它们是shell forks和execs ):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

无论是行为echo的WRT来\c-n变化。最好的选择是使用printf,我可以在四种不同的* NIX风格中使用它:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
感谢您的深入答复!
Darth Egregious 2015年

91

试试看

echo -e "Some string...\c"

正如我从您的问题中了解到的那样,它对我有效。

请注意,我是从man页面上获得此信息的。该man页面还指出,shell可能具有其自己的版本echo,并且不确定是否bash具有其自己的版本。


+1可以向我提示正确的方向,尽管无法识别-ne选项的回声可能也无法识别-e(也不需要)选项,因此您可能只想说一句话echo "some string...\c"。但是,如果您需要使用截然不同的echo命令来支持多个bash变体,则可能最好使用printf,或者需要使用类似的东西检查echo命令的功能[ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(至少bash也支持\ c,因此无需使用-n选项,但需要-e进行bash)
Timo's

对我来说,这确实与-n在OP的情况下一样:输出文字-e。我想printf确实更加一致
aexl

-e在posix shell脚本中不起作用,它将输出到屏幕上。
Thomas Dignan '19

7

为此,基本上有两种我经常使用的方法:

1.光标转义符(\c)与echo -e

范例

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -e标志启用字符串中的E scape字符。
  • \c带来的Ç ursor回到当前行。

要么

2.使用printf命令

范例

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

如果在if和其他命令(例如“ read”)中使用echo,则它可能会忽略该设置,并且无论如何都会跳到新行。


2

仅适用于最受欢迎的linux Ubuntu,它是bash

  1. 检查您使用的是哪个外壳?大多在下面的作品,否则看到这个

    echo $0

  2. 如果上面打印了bash,则下面的内容可以工作:

    printf "hello with no new line printed at end"
    要么
    echo -n "hello with no new line printed at end"


1

我相信现在您的输出如下

~ echo -e "String1\nString2"
String1
String2

您可以用来xargs将多行标准输出插入同一行。

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

在编写脚本时,shell脚本始终将第一行作为#!/ usr / bin / env bash。此shell不会忽略或操纵转义序列。ex echo“这是第一\ n行”打印这是第一\ n行。


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.