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
适合简单的事情,例如echo hello
,但我建议printf
用于更复杂的事情。
你在什么系统上,你的脚本使用什么外壳?
bash
有一个名为“echo”的“内置”命令:
$ type echo
echo is a shell builtin
此外,还有一个“echo”命令是一个正确的可执行文件(即 shell forks 和 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 -e "Some string...\c"
它按预期对我有用(正如我从你的问题中理解的那样)。
请注意,我从man
页面中获得了此信息。该man
页面还指出外壳可能有自己的版本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
flag 启用字符串中的E转义字符。 \c
使光标回到当前行。或者
2.使用printf
命令
示例:
for ((i = 0; i < 5; ++i)); do
printf "$i "
done
# 0 1 2 3 4
如果您在if中使用echo和其他命令,例如“read”,它可能会忽略该设置,并且无论如何它都会跳转到新行。
仅针对最流行的 Linux 发行版Ubuntu及其 Bash:
检查您使用的是哪个外壳。大多数情况下,以下工作,否则请参见:
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
作为第一行。
该外壳不会省略或操作转义序列。
例子:
echo "This is first \\n line"
印刷
This is first \n line.