回显新行和以 \t 开头的字符串

回显新行和以 \t 开头的字符串

当然,可以使用 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被传递\\techo -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'

%becho理解与(some s)相同的转义序列echo,而 的第一个参数printf(格式)也理解序列,但方式与echo(更像其他语言中的做法)略有不同。无论如何,\n双方都明白。

答案2

这不符合命令手册,但 man 本身指出了第 1 点:

  1. Echo 取决于您的 shell(有时还有其他原因需要避免它,例如管道)。
  2. Stéphane 的评论是不错的选择:printf它。
  3. 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"

相关内容