如何在bash printf中转义一系列反斜杠?

Cha*_*aye 12 string bash escaping backslash

以下脚本产生了意外的输出:

printf "escaped slash: \\ \n"
printf "2 escaped slashes: \\\\ \n"
printf "3 escaped slashes: \\\\\\ \n"
printf "4 escaped slashes: \\\\\\\\ \n"
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 14下作为bash脚本运行,我看到:

escaped slash: \
2 escaped slashes: \ 
3 escaped slashes: \\ 
4 escaped slashes: \\
Run Code Online (Sandbox Code Playgroud)

呃.. 什么?

Eug*_*sca 7

假设printf FORMAT字符串被双引号括起来,printf与例如echo(两者都是shell内置命令)相比,需要一个额外的扩展级别.

printf可以使用单引号实现您的期望:

printf '1 escaped slash:   \\ \n'
printf '2 escaped slashes: \\\\ \n'
printf '3 escaped slashes: \\\\\\ \n'
printf '4 escaped slashes: \\\\\\\\ \n'
Run Code Online (Sandbox Code Playgroud)

输出:

1 escaped slash:   \
2 escaped slashes: \\
3 escaped slashes: \\\
4 escaped slashes: \\\\
Run Code Online (Sandbox Code Playgroud)


Cyr*_*rus 5

printf是一个内置的 bash。看看help printf

printf [-v var] 格式 [参数]
      在 FORMAT 的控制下格式化和打印 ARGUMENTS。

您应该传递格式和参数。所以"%s\n"在参数之前添加格式:

printf "%s\n" "escaped slash: \\"
printf "%s\n" "2 escaped slashes: \\\\"
printf "%s\n" "3 escaped slashes: \\\\\\"
printf "%s\n" "4 escaped slashes: \\\\\\\\"
Run Code Online (Sandbox Code Playgroud)

输出:

转义斜线:\ 
2 转义斜线:\\ 
3 个转义斜线:\\\ 
4 个转义斜线:\\\\