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

查看:81
本文介绍了bash - 如何从逻辑上讲清楚: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的回答一样,我在回答时,在正文要写一倍数量的斜线才能得到我最终想要展示的斜线数量。

这篇关于bash - 如何从逻辑上讲清楚:printf中的多次转义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆