Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

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

为何下面的输出结果一样

debian8@debian:~$ awk 'BEGIN{system("printf '%x\\n'  32")}'
20ndebian8@debian:~$ awk 'BEGIN{system("printf '%x\\
'  32")}'
20ndebian8@debian:~$ 

请详细解释一下?


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

1 Answer

0 votes
by (71.8m points)

首先awk后面的字符串相当于3个字符串的连接

  1. 'BEGIN{system("printf ' #网页中代码颜色显示红色,表示字符串

  2. %x\\n #网页中代码颜色显示黑色,没有引号括起来的字串

  3. ' 32")}' #网页中代码颜色显示红色
    第一个和第三个字符串是有单引号引起来的,会原样输出

第二个字符串会变成:%x\n
加双引号的和不加双引号的区别:
加引号的斜线,当后面不是特殊字符时,会原样保留,如echo "a" #显示a
不加引号的斜线,当后面不是特殊字符时,不会显示,如echo a #显示ab
所以第二个命令里面第二个字符串虽然多了一个,但是后面是n,就像 echo #显示n一样,
她最终还是变成%x\n
传递给awk的字符串实际上是:BEGIN{system("printf %x\n 32")}
awk中斜线也是转义字符,她传递给system函数时,字符串"printf %x\n 32"就会变成:
printf %x 32
你可以在命令行运行上面的命令,就是你的结果。
这里printf的参数有没有加引号,shell转义后传递给printf的实际相当于printf %xn 32


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share

2.1m questions

2.1m answers

63 comments

56.7k users

...