echo 换行符在 bash 中不起作用

Bas*_*ser 14 linux script bash shell

我有有很多的bash脚本echo语句,也是我别名echoecho -e两个.bash_profile.bashrc,使新线为语句正常打印一样echo 'Hello\nWorld'的输出应该是

Hello
World
Run Code Online (Sandbox Code Playgroud)

但我得到的输出是

Hello\nWorld
Run Code Online (Sandbox Code Playgroud)

我什至尝试shopt -s expand_aliases在脚本中使用,它没有帮助

我正在运行我的脚本bash /scripts/scriptnm.sh;如果我. /scripts/scriptnm.sh在获得所需的输出时运行它...

Chr*_*sen 20

混合历史echo意味着它的默认操作因外壳而异。POSIX指定echo如果第一个参数是-n或任何参数包含反斜杠,则结果是“实现定义的” 。

printf在行为更明确的情况下使用(作为内置命令或外部命令)更可靠:格式字符串(第一个参数)中支持 C 样式的反斜杠转义和格式说明符。

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar
Run Code Online (Sandbox Code Playgroud)

您可以控制的反斜杠转义序列扩张的bashecho内置命令与xpg_echo外壳选项。

将它设置在任何bash脚本的顶部,以echo自动展开反斜杠转义,而不必添加-e到每个 echo 命令。

shopt -s xpg_echo
echo 'foo\nbar'
Run Code Online (Sandbox Code Playgroud)


Den*_*son 7

推荐的做法是printf用于所有新脚本。

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"
Run Code Online (Sandbox Code Playgroud)


use*_*686 6

当您使用 时bash myfile.sh,Bash 以“批处理”模式在单独的进程中运行,并且不会读取其配置文件或 rcfile。

当您使用. myfile.sh,该文件来源由当前shell进程(好像它的内容是由你输入),所以它看到您的当前定义的别名。

一般来说,编写依赖于任何特定 shell 配置的脚本是一个非常糟糕的主意,尤其是别名,除非您在脚本本身中定义它们。(永远不要依赖用户的.bashrc,即使它是你自己的。)