Bash中printf输出随机值问题:为何未得到预期结果fe?
为什么Bash脚本的printf输出随机值,而非预期的fe?
你的脚本输出随机值的核心原因是printf参数写法错误,导致它输出的是字符串的内存地址,而非目标字符的十六进制值:
问题分析
原脚本中的printf '%x' "'$foo"存在关键语法问题:
'$foo会被Bash展开成单引号字符加上变量foo的内容(即'+\376,一个长度为2的字符串)。- 当
printf使用%x格式符时,它期望接收整数参数。但如果传入字符串,Bash会将该字符串在内存中的指针地址作为整数传递给printf。 - 由于系统开启了ASLR(地址空间布局随机化),每次脚本运行时字符串的内存地址都是随机的,因此输出的十六进制值自然也是随机的。
正确写法
要输出字符\376对应的十六进制值fe,可以用以下两种方式修改脚本:
方式1:直接使用字符常量
#!/bin/bash printf '%x' '\376'
方式2:通过变量获取字符ASCII值再转换
#!/bin/bash foo=$'\376' # 先获取字符的ASCII整数值,再转为十六进制 ascii=$(( "'$foo" )) printf '%x\n' "$ascii"
或者更简洁的写法:
#!/bin/bash foo=$'\376' printf '%x' "'${foo:0:1}"
这里'${foo:0:1}会提取变量foo的第一个字符,作为Bash字符常量解析为对应的ASCII整数值,最终输出预期的fe。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

