回显换行符在 bash 中不起作用

回显换行符在 bash 中不起作用

我有一个包含大量echo语句的 bash 脚本,并且我还将其别名echoecho -ein.bash_profile.bashrc,以便可以正确打印语句的新行,例如echo 'Hello\nWorld'输出应该是

Hello
World

但我得到的输出是

Hello\nWorld

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

我正在运行我的脚本bash /scripts/scriptnm.sh;如果我按如下方式运行它,. /scripts/scriptnm.sh我会得到所需的输出......

答案1

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

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

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

您可以控制反斜杠转义序列的扩展狂欢带有shell 选项echo的内置命令xpg_echo

将其设置在任意狂欢脚本可以echo自动扩展反斜杠转义符,而无需添加-e到每个 echo 命令中。

shopt -s xpg_echo
echo 'foo\nbar'

答案2

建议的做法是用于printf所有新脚本。

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

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

答案3

当你使用时bash myfile.sh,Bash 以“批处理”模式运行,分离流程,以及才不是读取其配置文件或 rcfile。

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

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

答案4

这在终端上运行良好

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

保存到文件并使其可执行(chmod +x)

作为 ./your_file 运行

相关内容