Bash脚本中十六进制值递增:循环内变量赋值实现
解决十六进制值循环递增的问题
哈哈,这个问题我之前也碰到过!你踩的坑其实是shell单引号的变量展开规则——单引号里的内容会被原封不动地传给命令,所以bc根本没拿到$key的实际值,而是收到了字符串$key+1,自然算不出结果~
修复你的初始命令
把单引号换成双引号,这样shell会先把$key替换成当前的十六进制值,再传给bc计算:
key=$(echo "obase=16;ibase=16;$key+1" | bc)
完整循环示例(基于bc的方式)
下面是从0x0到0xffff完整遍历的脚本:
# 初始化key为十六进制的0 key="0" while :; do # 这里添加你需要用key执行的操作,比如打印、传入其他命令 echo "当前键值: 0x$key" # 递增十六进制值 key=$(echo "obase=16;ibase=16;$key+1" | bc) # 当key超过0xffff(变为10000)时退出循环 if [ "$key" = "10000" ]; then break fi done
更高效的写法(无需bc)
bash本身支持十六进制算术和进制转换,我们可以直接用十进制循环(0xffff对应十进制65535),再通过printf转成十六进制字符串,这样不用每次调用外部工具,效率更高:
# 循环覆盖十进制0到65535(对应十六进制0x0到0xffff) for ((i=0; i<=0xffff; i++)); do # 转成4位大写十六进制,要小写就用%04x key=$(printf "%04X" "$i") echo "当前键值: 0x$key" # 在这里执行你需要用key的业务逻辑 done
小提示
bc默认输出大写十六进制,printf的%X也是大写,如果你需要小写结果,把格式符改成%x即可。- 两种方法各有优势:第一种适合已有十六进制字符串变量、需要基于它递增的场景;第二种更适合固定范围的遍历,性能更好。
内容的提问来源于stack exchange,提问作者Kevin Gardenhire
相关产品推荐
相关产品推荐

