我的脚本中的
echo
有问题:
echo -n "Some string..."
打印
-n Some string...
并移至下一行。在控制台中它可以正常工作而无需换行:
Some string...
echo
命令有多个版本,具有不同的行为。它通常内置于 shell 中。如果不是,echo
通常会调用/bin/echo
或/usr/bin/echo
,它们本身可以来自许多实现中的任何一个。
显然您的脚本使用的 shell 使用的版本无法识别
-n
。
printf
命令具有更加一致的行为。 echo
适用于像 echo hello
这样的简单事物,但我建议使用 printf
来处理更复杂的事物。
您使用的是什么系统,您的脚本使用什么 shell?
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"
尝试使用
echo -e "Some string...\c"
它按预期对我有用(正如我从你的问题中了解到的)。
请注意,我是从
man
页面获取此信息的。 man
页面还指出 shell 可能有自己的 echo
版本,我不确定 bash
是否有自己的版本。
为了实现这一目标,我经常使用的基本上有两种方法:
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
如果您在 if 中使用 echo 以及其他命令(例如“read”),它可能会忽略该设置,并且无论如何都会跳转到新行。
仅针对最流行的 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"
enable -n echo
echo -n "Some string..."
我相信现在你的输出打印如下
~ echo -e "String1\nString2"
String1
String2
您可以使用 xargs 将多行标准输出放入同一行。
~ echo -e "String1\nString2" | xargs
String1 String2
~
当您编写 shell 脚本时,请始终使用
#!/usr/bin/env bash
作为第一行。
此 shell 不会省略或操纵转义序列。
示例:
echo "This is first \\n line"
打印
This is first \n line.