【问题标题】:Echo Output on the Same line [duplicate]在同一行上回显输出[重复]
【发布时间】:2014-09-14 15:29:36
【问题描述】:

我正在尝试使用 bash 脚本中的 echo 命令在同一行打印输出。 Echo 命令在循环内给出,每次循环运行时,都会执行一个 echo 命令。但通常,echo 每次执行都会换行,但我希望每次执行时输出都在同一行。

这是我的示例小代码的外观:

 #!/bin/bash
loop=1;
while [ $loop -lt 5 ];
do
echo "-"
let loop=loop+1
done

我也尝试使用 echo 命令的 -n 选项,但没有输出。我用 echo -n "-" 替换了 stmt - echo "-"。

期望的输出是: “-----”

谁能帮我解决这个问题

【问题讨论】:

  • 这和powershell有什么关系?
  • 我是 shell 的初学者。 “Powershell”也作为对标签的建议出现。我真的不知道shell和powershell的区别。
  • 你可以随时将鼠标悬停在标签上,它会给你一个描述。我删除了标签并添加了bash,这样合适的人就会找到您的问题。
  • 我刚刚尝试了用 echo -n "-" 替换 echo "-" 的脚本,它似乎对我有用
  • echo -nprintf 应该都可以工作,即for ((i=1; i<5; i++)); do printf '-'; done

标签: bash shell


【解决方案1】:

你说你试过

echo -n "-"

这应该有效。事实上,我怀疑确实如此。

问题可能是您的输出末尾没有换行符。随着更改为

echo -n "-"

您的脚本应该打印 5 个 - 字符,并且没有换行符。脚本完成后打印的 shell 提示可能破坏了输出。

作为快速测试,尝试添加

sleep 5

到脚本的末尾,看看----- 是否出现。 5 秒后,看看打印下一个 shell 提示时会发生什么。

试试这个:

#!/bin/bash
loop=1;
while [ $loop -lt 5 ]
do
    echo -n "-"
    let loop=loop+1
done
echo ""

最后的 echo "" 只打印一个换行符。

其他一些注意事项:

缩进很重要,尤其是对于更大更复杂的脚本。它一目了然地显示了您的代码结构,并使其更易于阅读。

在您问题的代码中,#!/bin/bash 前面有一个空格。 #! 仅在行首被识别。如果没有有效的#! 行,您的脚本将由/bin/sh 执行,而不是由/bin/bash 执行。在这种情况下可能无关紧要,因为您没有使用任何特定于 bash 的功能。这可能是您发布问题时引入的错误,但请务必检查您的实际脚本并删除空格(如果存在)。

echo 命令存在于许多不同的版本中。它内置在大多数 shell 中,也可以作为单独的可执行文件/bin/echo 提供。不同的版本在它们识别的选项和特殊字符的语法方面可能有细微的不同。支持-n 选项以打印没有终止换行符的行可能几乎是普遍的。

printf 命令(类似于 C 的 printf() 函数)也存在于多个实现中,但其行为更加一致。如果您要做的不仅仅是打印一条简单的单行消息,那么使用printf 而不是echo 会更安全。同样,在这种情况下可能无关紧要,但请记住这是一件好事。

【讨论】:

  • 缩进很重要,但换行符也很重要,你的 "; ... do" 只需要 ";"当“do”与“while”在同一行时,否则换行就足够了。最后的“echo”通常不需要“”“”,除非你试图解释“echo”的许多不同的稍微不兼容的实现,在这种情况下“echo -n”不可靠或者,只有“echo ..stuff.. | tr -d '\012'” 如果真正的弹性跨 unix 平台是目标。当然,他确实说过“bash”,所以你可能不需要直接使用“tr”。
  • @AlexNorth-Keys:; 是对的,我已经删除了它,但它似乎是无害的。是的,使用echo "" 而不是echo 的目的是为了迎合echo 的不同实现;我想我使用的版本是 echo 没有参数不会打印任何内容。我认为 echo -n 比没有参数的echo 更便携,但如果你非常关心可移植性,你可能应该使用printf 无论如何(除非你在 真的没有它的旧系统)。我不知道tr'\012' 语法的处理有多便携。
  • tr 在我尝试过的任何地方都有效。在更广泛的 unix 领域中,任何东西都不能依赖 echo —— 如果没有参数,它可能什么也不输出,或者换行符,或者空格(!)和换行符。有些总是在最后一个 arg 之后附加一个空格,有些则没有。我会对前面带有破折号的任何内容保持谨慎,但不能依赖表示没有更多选项的“--”语法。即使是某些 shell 中的内置 echo 也不能依赖... Sun 过去常常根据您的搜索路径进行更改,猜测是首选 SysV 还是 BSD 语义。呵呵。:-)
  • 谢谢两位。 @KeithThompson:你能在最后详细说明目的 echo "" 吗?没有 stmt,脚本不会返回任何输出。但是使用 stmt 我可以看到所需的输出。它有什么不同?
  • @user3624000:echo "" 打印换行符。通常(但不总是)程序的输出应该由完整的行组成,这意味着最后应该有一个换行符。您确定如果没有echo "",它根本不会产生任何输出吗?您是否按照我的建议尝试添加 sleep 5
【解决方案2】:

您应该只将echo 用于信息性消息,而将printf 用于其他所有内容,因为它是一个更强大、更灵活且可靠的工具。语句顺序

printf '-'
printf '-'
printf '-'
printf '-'
printf '-'

实际产生输出-----

【讨论】:

  • 是的,但没有理由与echo -n "-" 表现不同。
  • echo -n 形式不可移植,不鼓励使用 echo 命令:pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html
  • 是的,但是 OP 正在使用 bash(假设 #! 前面的空格在实际脚本中不存在),并且 echo -n 在 bash 中工作。即使#! 不正确,正如我在回答中提到的那样,OP 也不太可能使用-n 不起作用的实现。如果他是,它将打印一个文字-n,OP 不会报告。您提出了关于使用 printf 而不是 echo 的有效观点,但这不太可能是 OP 问题的答案。
  • 只有在最近的 Unix 系统上才可靠,比如 Linux,当然。旧 Unixen 没有 printf 作为命令。
【解决方案3】:

尝试以下代替您当前的 echo 语句:

echo -e "-/c"

-e 选项允许 echo 使用分隔符,并且 /c 停止输出(在这种情况下是您不想要的尾随换行符)。

【讨论】:

  • -e 选项到echo 的可移植性可能不如-n
  • 正如您所指出的,OP 正在使用 bash,这意味着它应该可以工作,尽管它确实存在可移植性问题。但是,这甚至可能不是 OP 关心的问题,并且 /c 解决方案可以很好地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2012-07-31
  • 2013-12-28
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多