%d转换说明符的作用是验证参数仅为数字字符吗?是否未发生实际转换?
关于bash中printf的%d转换说明符的疑问解答
先看你给出的示例代码:
printf "This is a number: %d\n" 10 > This is a number: 10
直接说关键点:
- bash里所有命令的参数确实都是字符串,但printf的%d会主动把传入的字符串转换成整数,不是没发生转换。你传的"10"是字符串,printf会先将其解析为十进制整数10,再格式化为数字字符串输出——刚好结果和原字符串一致,所以你误以为没转换而已。
- %d的作用不是仅检查字符串是否由数字字符构成。如果传入非法数字格式的字符串(比如"10a"),printf会报错或输出0(不同系统实现略有差异),比如执行
printf "%d\n" 10a,GNU bash下会输出0且返回非零错误码,这说明它是真的在做转换操作,而非仅做字符检查。 - 要验证转换确实存在,可以试试传十六进制格式的字符串比如"0xa"给%d,它会转换失败输出0;但传给%x的话就会正确解析为10输出,这就能直观看出转换逻辑的差异。
内容的提问来源于stack exchange,提问作者Roger Costello
相关产品推荐
相关产品推荐

