Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

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

这个容易理解。

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

这个呢? --> n

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

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

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

下面几个,我就菜了。

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

[root@~]#echo "PS1=${PS1}"
PS1=[[e[32;40m]u@w]$

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

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

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...