【问题标题】:"echo -n" prints "-n""echo -n" 打印 "-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="."

标签: sh


【解决方案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 distributionUbuntu 及其 Bash:

      1. 检查您使用的是哪个外壳。主要是以下工作,否则see this

        echo $0

      2. 如果上面打印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 shellBash 有自己的内置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.
            

            【讨论】:

            【解决方案11】:

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

            print -n "Some string ...."
            

            print — Return arguments from the shell

            【讨论】:

              猜你喜欢
              • 2014-04-24
              • 2012-11-24
              • 1970-01-01
              • 2012-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多