You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:15:32