“echo -n”打印“-n”

问题描述 投票:0回答:11

我的脚本中的

echo
有问题:

echo -n "Some string..."

打印

-n Some string...

并移至下一行。在控制台中它可以正常工作而无需换行:

Some string...
sh
11个回答
676
投票

echo
命令有多个版本,具有不同的行为。它通常内置于 shell 中。如果不是,
echo
通常会调用
/bin/echo
/usr/bin/echo
,它们本身可以来自许多实现中的任何一个。

显然您的脚本使用的 shell 使用的版本无法识别

-n

printf
命令具有更加一致的行为。
echo
适用于像
echo hello
这样的简单事物,但我建议使用
printf
来处理更复杂的事物。

您使用的是什么系统,您的脚本使用什么 shell?


186
投票

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

$ type echo
echo is a shell builtin

此外,还有一个“echo”命令是一个正确的可执行文件(即 shell 分叉并执行

/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"

103
投票

尝试使用

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

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

请注意,我是从

man
页面获取此信息的。
man
页面还指出 shell 可能有自己的
echo
版本,我不确定
bash
是否有自己的版本。


13
投票

为了实现这一目标,我经常使用的基本上有两种方法:

1. 使用 光标转义字符 (

\c
) 和
echo -e

示例

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

2. 使用

printf
命令

示例

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

3
投票

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


3
投票

仅针对最流行的 Linux 发行版Ubuntu 及其 Bash:

  1. 检查您使用的是哪个 shell。大多数情况下,以下内容有效,否则请参阅此

    echo $0

  2. 如果上面打印出

    bash
    ,那么下面的内容将起作用:

    printf "hello with no new line printed at end"

    或者

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


2
投票
enable -n echo
echo -n "Some string..."

2
投票

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

~ echo -e "String1\nString2"
String1
String2

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

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

 ~

1
投票

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

 ksh
)贝壳。

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

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

$ printf "whatever"

相当于

echo -n "whatever"
,其中支持 -n


0
投票

当您编写 shell 脚本时,请始终使用

#!/usr/bin/env bash
作为第一行。

此 shell 不会省略或操纵转义序列。

示例:

echo "This is first \\n line"

打印

This is first \n line.

-1
投票

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

print -n "Some string ...."

print — 从 shell 返回参数

© www.soinside.com 2019 - 2024. All rights reserved.