我正在阅读有关 Unix 中的 echo 命令的内容,并且对 -e 选项与反斜杠 ( \
) 转义字符感到困惑,我运行了以下两个示例:
echo "hello\\\\world"
输出:hello\\world
现在使用 -e 运行相同的命令:
echo -e "hello\\\\world"
输出:hello\world
那么带和不带选项的反斜杠字符的含义是什么-e
?
问候
答案1
在 Bash 双引号字符串中,您可以使用反斜杠来确保下一个字符被视为文字。也就是说,输入参数"a\\b"
会导致传递文字字符串 a\b
到命令。由此我们可以得出结论,在这两种情况下,您都将hello\\world
作为最终参数传递给echo
- 在传递给 之前,每对反斜杠都会扩展为单个文字反斜杠echo
。
“启用对以下反斜杠转义的解释”-e
的标志(详细信息请参见)。被列为单个反斜杠的转义序列,因此在本例中,Bash 对原始字符串执行相同的操作,并将两个反斜杠减少为一个。该标志主要用于能够包含转义序列,例如水平制表符或换行符。例如:echo
help echo
\\
echo
-e
\t
\n
$ echo -e 'first\tsecond\tthird'
first second third
我建议用printf
它来代替。首先,它使用格式字符串意味着我们可以安全地将用户提供的字符串与转义序列混合:
$ printf '%s\t%s\t%s\n' 'inject\nescape' '\\' '\evil'
inject\nescape \\ \evil
其次,并非所有版本都echo
支持-e
,并且不小心使用不带引号的变量会让人们改变echo
的行为:
$ injection='-e a\nb'
$ echo $injection
a
b
第三:本博士论文级别分析。
顺便说一句,Bash 确实不是将单引号字符串中的反斜杠视为转义字符,这就是我们得到以下结果的原因:
$ echo 'hello\\\\world'
hello\\\\world
$ echo -e 'hello\\\\world'
hello\\world