623

echo我的脚本有问题:

echo -n "Some string..."

印刷

-n Some string...

并移动到下一行。在控制台中,它可以在没有换行符的情况下正常工作:

Some string...
4

11 回答 11

670

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

printf命令具有更加一致的行为。echo适合简单的事情,例如echo hello,但我建议printf用于更复杂的事情。

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

于 2012-06-25T16:42:33.530 回答
180

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

$ type echo
echo is a shell builtin

此外,还有一个“echo”命令是一个正确的可执行文件(即 shell forks 和 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"
于 2012-06-28T18:28:40.983 回答
101

尝试

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

它按预期对我有用(正如我从你的问题中理解的那样)。

请注意,我从man页面中获得了此信息。该man页面还指出外壳可能有自己的版本echo,我不确定是否bash有自己的版本。

于 2012-06-25T16:44:52.953 回答
13

为了实现这一点,我经常使用两种方法:

1.使用光标转义字符 ( \c)echo -e

示例

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eflag 启用字符串中的E转义字符。
  • \c使光标回到当前行。

或者

2.使用printf命令

示例

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4
于 2019-11-25T19:19:46.573 回答
3

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

于 2015-08-07T20:20:03.700 回答
3

仅针对最流行的 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"

于 2019-05-22T01:45:07.920 回答
2
enable -n echo
echo -n "Some string..."
于 2020-03-16T09:29:01.583 回答
1

请注意,AIX上的/usr/bin/echo/bin/echo不支持任何参数,因此如果使用 sh 或KornShell ( ) shell , -n-e都不起作用。ksh

C shellBash有自己的内置echo支持-n
这是相关的,因为许多 shell 脚本明确使用sh或 KornShell。

AIX 确实有/usr/bin/printf,因此正如一些较早的答案中所建议的,

$ printf "whatever"

相当于支持-necho -n "whatever"的地方。

于 2021-06-18T17:15:33.440 回答
1

我相信现在您的输出打印如下

~ echo -e "String1\nString2"
String1
String2

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

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

 ~
于 2019-11-25T09:26:18.433 回答
0

当你去编写你的 shell 脚本时,总是使用#!/usr/bin/env bash作为第一行。

该外壳不会省略或操作转义序列。

例子:

echo "This is first \\n line"

印刷

This is first \n line.
于 2019-05-24T12:09:02.040 回答
0

我在 IBM z/OS中遇到了同样的问题,所以我使用print而不是echo,并且它有效。

print -n "Some string ...."

print — 从 shell 返回参数

于 2021-07-26T17:07:24.213 回答