Linux 添加两个十六进制数并作为十六进制数存储在shell脚本中
我试图在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)) +
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
生成粘贴输出。您确定粘贴了正确的代码和输出吗?有一个输入错误。我更正了代码。谢谢