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

Zer*_*uno 4 bash echo quoting

当然,可以使用 echo -e 以便将 \n 理解为新行。问题是当我想回显以 \t 开头的内容时,例如“\test”。

假设我想表演echo -e "test\n\\test"。我期望输出:

test
\test
Run Code Online (Sandbox Code Playgroud)

但相反输出:

test
  est
Run Code Online (Sandbox Code Playgroud)

\\t解释为制表符而不是文字 \t。这个问题有一个干净的解决方法吗?

Sté*_*las 6

echo -e "\\t"
Run Code Online (Sandbox Code Playgroud)

传递\t给是echo因为反斜杠在 中的双引号内是特殊的bash。它用作转义(引用)运算符。在 中\\,它逃脱了自身。

你可以这样做:

echo -e "\\\\t"
Run Code Online (Sandbox Code Playgroud)

forecho被传递\\techo -e "\\\t"也可以),或者您可以使用单引号,其中\不特殊:

echo -e '\t'
Run Code Online (Sandbox Code Playgroud)

现在,echo是一个非常不可移植的命令。即使在 中bash,其行为也可能取决于环境。我建议避免使用它并使用printf它,您可以这样做:

printf 'test\n\\test\n'
Run Code Online (Sandbox Code Playgroud)

或者甚至决定哪些部分经历这些转义序列扩展:

printf 'test\n%s\n' '\test'
Run Code Online (Sandbox Code Playgroud)

或者:

printf '%b%s\n' 'test\n' '\test'
Run Code Online (Sandbox Code Playgroud)

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