我试图在shell脚本中添加两个十六进制数,并将结果存储为十六进制数。

let "step_size = 10"
let "start_num = 20000000"
let "size = 64"
for (( i = 0; i < 1000; i = $i + $step_size ))
do
    for (( j = 0; j < $step_size; j++ ))
    do
        let "temp = $(( $(( $i * $step_size)) + $(( $j * $size )) ))"
        num=`echo "obase=16; $temp" | bc`
        echo $num
        num2=`obase=16;ibase=16; echo $start_num \\+ $num | bc`
        echo $start_num $num $num2
        echo "****"
    done
done

并非所有的结果都是错误的。只有当$num = C0
产量
0
20000000 0 20000000
****
40
20000000 40 20000040
****
80
20000000 80 20000080
****
C0
20000000 C0 20000090 #This is the error!!
****
100
20000000 100 20000100
****
...
...
...
1C0
20000000 1C0 20000190 #Error again!!

我在用zshell。我不知道为什么会这样。任何帮助都是非常感谢的。
谢谢

最佳答案

可能

num2=`obase=16;ibase=16; echo $start_num \\+ $num | bc`

应该是
num2=`echo "obase=16;ibase=16;$start_num + $num" | bc`

你根本没在计算魔法。
我还建议使用类似这样的简化版本:
#!/bin/zsh

step_size=10
start_num=20000000
size=64

for (( i = 0; i < 1000; i += step_size )); do
    for (( j = 0; j < step_size; ++j )); do
        (( temp = (i * step_size) + (j * size) ))
        num=$(echo "obase=16; $temp" | bc)
        echo "$num"
        num2=$(echo "obase=16;ibase=16;$start_num + $num" | bc)
        echo "$start_num $num $num2"
        echo "****"
    done
done

在zsh和bash中都有效。
# bash temp.zsh | head -20
0
20000000 0 20000000
****
40
20000000 40 20000040
****
80
20000000 80 20000080
****
C0
20000000 C0 200000C0
****
100
20000000 100 20000100
****
140
20000000 140 20000140
****
180
20000000 180 20000180

08-16 09:33