Linux 添加两个十六进制数并作为十六进制数存储在shell脚本中

Linux 添加两个十六进制数并作为十六进制数存储在shell脚本中,linux,bash,shell,hex,zsh,Linux,Bash,Shell,Hex,Zsh,我试图在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)) +

我试图在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
我正在使用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
大概

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

@konsolebox有一个正确的修正,但我认为OP中显示的行为有点神秘,因此似乎值得一个解释

首先,很明显

num2=`obase=16;ibase=16; echo $start_num \\+ $num | bc`
不正确,因为它正在设置shell变量
obase
ibase
,而不是将赋值传递给
bc
。此外,没有必要引用+。但是为什么
bc
不会像以现代形式书写的行那样,从\产生错误:

num2=$(obase=16;ibase=16; echo $start_num \\+ $num | bc)
答案是,
``
$(…)
之间有细微的区别:

引述:

使用旧式反引号形式的替换时,反斜杠保留其字面含义,后面跟$、`、或\的情况除外。第一个不带反斜杠的反引号终止命令替换。使用
$(命令)
表单时,括号之间的所有字符组成命令;没有人受到特殊对待

实际上,这意味着反引号版本将解释
\
-转义两次:第一次是在扫描反引号字符串时,当
\+
变为
\+
时,第二次是在解析生成的命令时,当
\+
变为
+

第二个问题是“20000900是从哪里来的?”这里的答案是这是
bc
解释数字方式的一个奇怪特征。值得引用《曼恩bc》中的整段话(重点补充):

输入的数字可能包含字符
0-9
A-F
。(注意:它们必须是大写。小写字母是变量名。)无论
ibase
的值如何,单个数字始终具有数字的值。(即,
A=10
对于多位数,
bc
将所有大于或等于
ibase
的输入位数更改为
ibase-1
的值,这使得数字
FFF
始终是输入基数中最大的3位数

由于
ibase
未在
bc
中设置(见上文),
bc
C0
解释为十进制
90
,尽管它会将
C
解释为十进制
12


最后,通过使用
bash
zsh
,以下功能可以正常工作,无需使用
bc

% a=20000000
% b=C0
% printf "%X\n" $((0x$a+0x$b))
200000C0

@konsolebox有一个正确的修正,但我认为OP中显示的行为有点神秘,因此似乎值得一个解释

首先,很明显

num2=`obase=16;ibase=16; echo $start_num \\+ $num | bc`
不正确,因为它正在设置shell变量
obase
ibase
,而不是将赋值传递给
bc
。此外,没有必要引用+。但是为什么
bc
不会像以现代形式书写的行那样,从\产生错误:

num2=$(obase=16;ibase=16; echo $start_num \\+ $num | bc)
答案是,
``
$(…)
之间有细微的区别:

引述:

使用旧式反引号形式的替换时,反斜杠保留其字面含义,后面跟$、`、或\的情况除外。第一个不带反斜杠的反引号终止命令替换。使用
$(命令)
表单时,括号之间的所有字符组成命令;没有人受到特殊对待

实际上,这意味着反引号版本将解释
\
-转义两次:第一次是在扫描反引号字符串时,当
\+
变为
\+
时,第二次是在解析生成的命令时,当
\+
变为
+

第二个问题是“20000900是从哪里来的?”这里的答案是这是
bc
解释数字方式的一个奇怪特征。值得引用《曼恩bc》中的整段话(重点补充):

输入的数字可能包含字符
0-9
A-F
。(注意:它们必须是大写。小写字母是变量名。)无论
ibase
的值如何,单个数字始终具有数字的值。(即,
A=10
对于多位数,
bc
将所有大于或等于
ibase
的输入位数更改为
ibase-1
的值,这使得数字
FFF
始终是输入基数中最大的3位数

由于
ibase
未在
bc
中设置(见上文),
bc
C0
解释为十进制
90
,尽管它会将
C
解释为十进制
12


最后,通过使用
bash
zsh
,以下功能可以正常工作,无需使用
bc

% a=20000000
% b=C0
% printf "%X\n" $((0x$a+0x$b))
200000C0

使用
sh
bash
zsh
,您发布的代码不会生成粘贴的输出。您确定粘贴了正确的代码和输出吗?有一个输入错误。我更正了代码。感谢您发布的代码没有使用
sh
bash
zsh
生成粘贴输出。您确定粘贴了正确的代码和输出吗?有一个输入错误。我更正了代码。谢谢