我在脚本中使用 echo
函数遇到了问题:
echo -n "Some string..."
打印-n Some string...
并移到下一行。在控制台中,它可以正常工作且没有换行符:
Some string...
我在脚本中使用 echo
函数遇到了问题:
echo -n "Some string..."
打印-n Some string...
并移到下一行。在控制台中,它可以正常工作且没有换行符:
Some string...
有多个版本的echo
命令,它们有不同的行为。 显然,您脚本所使用的 shell 使用了一个不认识 -n
的版本。
printf
命令具有更加一致的行为。 对于像 echo hello
这样简单的内容,echo
是可以使用的,但是对于任何更复杂的内容,我建议使用 printf
。
您使用的是什么系统,您的脚本使用的是哪个 shell?
#!/bin/bash
开头,这样做就成功了。通常我使用bash。 - qwertzprintf
命令。 - Keith Thompsonprintf hello; sleep 5
- Keith Thompsonzsh
有一个选项可以显示特定字符来指示换行符的缺失,以便在任何情况下都可以在下一行显示提示符而不会混淆。 - chepnerbash
有一个称为“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"
/bin/echo -n
来确保使用可执行文件以获取无换行显示。printf
可能是一个更好的选择,但如果你习惯使用echo,你仍然可以通过这种方式获得你期望的功能。 - tobylaroni/bin/bash
和 /bin/sh
都是 bash(因此使用内置命令),但只有前者支持 -n
选项。我在 https://apple.stackexchange.com/a/410266/157202 找到了一个很好的解释... sh
在 POSIX 兼容模式下运行。 - lmsurprenant尝试使用
echo -e "Some string...\c"
根据我的理解,这对我起到了预期的效果。
请注意,我从man
页面获取了这些信息。 man
页面还指出,shell可能有自己的版本echo
,而我不确定bash
是否有自己的版本。
echo "一些字符串...\c"
。然而,如果你需要支持多个具有完全不同的 echo 命令的 bash 变体,那么最好使用 printf 命令,或者你需要使用类似 [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"
的命令来检查 echo 命令的功能(至少 bash 也支持 \c,所以不需要使用 -n 选项,但是你需要在 bash 中使用 -e 选项)。 - Timozsh
中不需要使用 -e
。可以使用 -n
(无新行)选项。为什么不使用 zsh
并离开其他 shell 呢? - Timo为了实现这一点,基本上有两种方法我经常使用:
1. 使用游标转义字符(\c
)和echo -e
命令
示例:
for i in {0..10..2}; do
echo -e "$i \c"
done
# 0 2 4 6 8 10
-e
标志启用了字符串中的E转义字符。\c
将C光标带回当前行。或者
2.使用printf
命令
示例:
for ((i = 0; i < 5; ++i)); do
printf "$i "
done
# 0 1 2 3 4
仅适用于最受欢迎的Linux发行版,Ubuntu和它的Bash:
检查您正在使用哪个shell。大多数情况下以下命令有效,否则参见此处:
echo $0
如果上述命令打印bash
,则以下命令有效:
printf "hello with no new line printed at end"
或
echo -n "hello with no new line printed at end"
如果你在一个带有其他命令的if语句中使用echo,比如“read”,它可能会忽略设置并且会跳到一个新的行。
~ echo -e "String1\nString2"
String1
String2
~ echo -e "String1\nString2" | xargs
String1 String2
~
enable -n echo
echo -n "Some string..."
当你编写Shell脚本时,请始终使用#!/usr/bin/env bash
作为第一行。
这个shell不会省略或操纵转义序列。
示例:
echo "This is first \\n line"
打印
This is first \n line.
bash
,它在这里可以正常工作。另外,你真的在使用 Bourne Shell 作为交互式 shell 的可能性不太大吧? - FatalErrorecho -ne "不换行的文本: "; echo "一些文本";
。 - zsoltii#!/usr/bin/env sh
开头的脚本中遇到了这个问题。非常好奇,因为sh和bash都声称它们是“GNU bash,版本3.2.57(1)-release(arm64-apple-darwin21)”。但我证明了它:sh -c“echo -n”
会打印出-n
,而bash -c“echo -n”
则不会。 - lmsurprenant