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


13

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

Hello
World

但是我得到的输出是

Hello\nWorld

我什至尝试shopt -s expand_aliases在脚本中使用,但无济于事

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


3
echo像你想的那样走样是不好的做法恕我直言
shellholic 2011年

1
使用双引号将\ n解释为。单引号阻止对\ n和其他许多东西的解释。
BillThor

Answers:


16

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

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

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

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

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

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; 为我工作。
Bashuser 2011年

6

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

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

通常,除非您在脚本本身中定义脚本,否则编写依赖于任何特定Shell配置(尤其是别名)的脚本是一个非常糟糕的主意。(即使是您自己的,也不要依赖用户的。).bashrc


5

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

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

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

+1 printf的使用要比echo更为复杂,但是在避免echo的不一致方面,它的收益不菲。
戈登·戴维森

1

这在终端工作正常

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

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

以./your_file运行


将其作为bash your_file运行并检查输出。
Bashuser 2011年

按预期工作
LaLeX 2011年

但是回显“ Hello \ nWorld”未显示预期的输出。由于echo已经是echo -e的别名,所以它应该别名,但是它不起作用,这就是我的问题
Bashuser 2011年

由于别名回声是不好的做法(取决于它的程序可能会中断),您应该删除别名,然后在脚本中搜索回声结尾,将其替换为echo -e
LaLeX

非常感谢LaLex的回答,有没有一种方法可以使我获得别名的预期结果,尽管这不是一个好习惯
Bashuser 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.