如何在使用 echo 时添加新行

如何在使用 echo 时添加新行

为什么以下命令不在生成的文件中插入新行,解决方案是什么?

$ echo "Line 1\r\nLine2" >> readme.txt

$ cat readme.txt 
Line 1\r\nLine2

答案1

将 -e 标志传递给 echo 以使其解析转义字符,例如“\r\n”,如下所示:

echo -e "Line 1\r\nLine2" >> readme.txt

答案2

echo


echo如果您这样做,严格符合 Single Unix 规范的实现将添加换行符:

echo 'line1\nline2'

但这不是一个可靠的行为。事实上,确实有不是您可以期望的任何标准行为echo

操作数

string

要写入标准输出的字符串。如果第一个操作数是-n,或者任何操作数包含<\反斜杠>性格,结果由实现定义

符合 XSI 标准系统中,如果第一个操作数是-n,则应将其视为字符串,不是一个选择。在任何参数中,以下字符序列应在符合 XSI 的系统上被识别:

\a- 写一个<警报>

\b- 写一个<退格键>

\c- 抑制<换行>否则跟随输出中的最后一个参数。参数中跟随的所有字符都\c将被忽略。

\f- 写一个<换页>

\n- 写一个<换行>

\r- 写一个<回车>

\t- 写一个<选项卡>

\v- 写一个<垂直制表符>

\\- 写一个<反斜杠>特点。

\0num- 写入一个 8 位值,即零、一、二或三位数的八进制数num

因此,确实没有任何通用方法可以知道如何使用 编写换行符echo,除非您通常可以依靠这样做echo

shellbash通常会执行以下操作:不是符合规范,并处理-n和其他选项,但即使如此也是不确定的。你可以做:

shopt -s xpg_echo
echo hey\\nthere

hey
there

甚至不是那个如果bash是使用构建时选项构建的,则这是必要的...

--enable-xpg-echo-default

默认情况下,内置echo扩展反斜杠转义字符,无需该-e选项。这设置了默认值xpg_echo外壳选项on,这使得 Bash 的echo行为更像单一 Unix 规范版本 3 中指定的版本。请参阅Bash 内置函数,了解可识别的转义序列的描述echo


printf


另一方面,printf相比之下, 的行为却相当温和。

基本原理

添加该printf实用程序是为了提供历史上由echo.然而,由于不可调和的分歧在现有的各个版本中echo,该版本几乎没有什么特殊功能,这些都留给了这个新printf实用程序,它基于第九版系统中的一个。

扩展描述部分几乎完全匹配printf()ISO C 标准中的函数,尽管它是按照文件格式符号进行描述的XBD 文件格式表示法

它处理描述其参数的格式字符串 - 可以是任意数量的东西,但对于字符串来说几乎要么是%byte 字符串,要么是文字%s字符串。除了%f第一个参数中的格式之外,它的行为最像yte%b字符串参数,只是它不处理转义\c

printf ^%b%s$ '\n' '\n' '\t' '\t'

^
\n$^    \t$

为什么printf优于echo了解更多。


echo() printf


您可以编写自己的标准,echo例如......

echo(){
    printf '%b ' "$@\n\c"
}

...这应该总是自动做正确的事情。

\n实际上,不...如果最后一个参数以奇数结尾,则在参数的末尾打印一个文字<反斜杠>

但这并没有:

echo()
    case    ${IFS- } in
    (\ *)   printf  %b\\n "$*";;
    (*)     IFS=\ $IFS
            printf  %b\\n "$*"
            IFS=${IFS#?}
    esac

答案3

在我使用过的所有版本的 bash 中,您可以简单地以交互方式或在脚本中将文字换行符插入到字符串中,前提是该字符串被充分引用。

互动式:

$ echo "Line one
> Line two"
Line one
Line two
$

在脚本中:

echo "Line one
Line two"

答案4

人们已经给出了充分的答案,但我拒绝接受 echo 接受除 之外的任何选项的世界-n

nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3

相关内容