如何从逻辑上讲清楚:printf中的多次转义

这个容易理解。

debian8@debian:~$ printf "%-5s\n"  "hah"

hah

这个呢? \n --> n

debian8@debian:~$ printf "%-5s\\n"  "hah"

hah

按照上面的逻辑 \n如何解析? \n -->\n --> n 为何输出 n(字面),咩有换行?

debian8@debian:~$ printf "%-5s\\\n"  "hah"

hah \ndebian8@debian:~$

下面几个,我就菜了。

debian8@debian:~$ printf "%-5s\\\\n"  "hah"

hah \ndebian8@debian:~$ printf "%-5s\\\\\n" "hah"

hah \

debian8@debian:~$ printf "%-5s\\\\\\n" "hah"

hah \

请解释一下,bash的这种行为?

回答:

bash对于双引号首先会先进行“处理”再传递给某个命令,我们从显示一个bash变量就可以看出。例:

[root@~]#echo "PS1=${PS1}"

PS1=[\[\e[32;40m\]\u@\w]\$

echo命令不会解析bash变量,所以肯定是bash在传递给命令echo之前,对一个用双引号括起来的字符串进行了处理。

回归提问,例:printf "%-5s\\\\\n" "hah" 首先bash解析字符串"%-5s\\\\\n",变成:
'%-5s\\\n' 传给printf,printf根据它自身的规定解析是一个斜线(\\),加上一个换行(\n)

如何让Bash不对字串进行解析?可以把双引号改成单引号。

经过bash解析后的字串到底是什么?可以用echo "%-5s\\\\\n",查看,得到的字符串就是传给printf的字符串。

总结:双引号中斜线解析后传给命令的字串中个数规律:
解析后斜线数量=int((解析前斜线数量+1)/2) int表示取整。
1个和2个都解析成1个,3个和4个都解析成2个…………

Bash中的处理和segmentfault的回答一样,我在回答时,在正文要写一倍数量的斜线才能得到我最终想要展示的斜线数量。

回答:

图片描述

以上是 如何从逻辑上讲清楚:printf中的多次转义 的全部内容, 来源链接: utcz.com/p/193854.html

回到顶部