当然,可以使用 echo -e 以便将 \n 理解为新行。问题是当我想回显以 \t 开头的内容时,例如“\test”。
假设我想表演echo -e "test\n\\test"
。我期望输出:
test \test
但相反输出:
test est
被\\t
解释为制表符而不是文字 \t。这个问题有一个干净的解决方法吗?
答案1
echo -e "\\t"
传递\t
给是echo
因为反斜杠在 中的双引号内是特殊的bash
。它充当逃跑(引用)运算符。在 中\\
,它逃脱了自身。
你可以这样做:
echo -e "\\\\t"
forecho
被传递\\t
(echo -e "\\\t"
也可以),或者您可以使用单引号,其中\
不特殊:
echo -e '\t'
现在,echo
是一个非常不可移植的命令。即使在 中bash
,其行为也可能取决于环境。我建议避免使用它并使用它printf
,您可以这样做:
printf 'test\n\\test\n'
或者甚至决定哪些部分经历这些转义序列扩展:
printf 'test\n%s\n' '\test'
或者:
printf '%b%s\n' 'test\n' '\test'
%b
echo
理解与(some s)相同的转义序列echo
,而 的第一个参数printf
(格式)也理解序列,但方式与echo
(更像其他语言中的做法)略有不同。无论如何,\n
双方都明白。
答案2
这不符合命令手册,但 man 本身指出了第 1 点:
- Echo 取决于您的 shell(有时还有其他原因需要避免它,例如管道)。
- Stéphane 的评论是不错的选择:
printf
它。 echo
解决方案echo -e "a\na\ta"
(双引号,如果您想扩展该代码以获得更多内容,请阅读它们的作用)和测试:
`
➜ ~ echo -e a \n a \ta
a n a ta
➜ ~ echo -e "a \n a \ta"
a
a a
➜ ~ echo -e "a\na\ta"
a
a a
➜ ~ bash
T420s:~$ echo -e "a\na\ta"
a
a a
T420s:~$ echo -e a\na\ta
anata
T420s:~$ echo a\na\ta
anata
T420s:~$ echo "a\na\ta"
a\na\ta
T420s:~$
第一个 shell 是 ZSH。
答案3
shell 代码片段"test\n\\test"
扩展为 string test\n\test
,因为双引号内的反斜杠会导致下一个字符按字面解释(如果下一个字符是其中之一)"$\`
,否则反斜杠本身按字面解释。然后echo -e
替换\n
为换行符和\t
制表符。
避免使用双引号来引用文字文本。使用单引号代替:它们有更简单的规则 - 单引号内的所有内容都按字面解释为单引号。如果您选择使用双引号,请勿使用后面没有要引用的字符的反斜杠 - 如果您希望在双引号内使用反斜杠,请使用\\
。
echo -e 'test\n\\test'
echo -e "test\\n\\\\test"