我正在尝试从树莓派读取i2c地址中的值。通过使用i2ctools,我可以获取一个地址并将其存储在变量中。
reg_state=$(i2cget -y 1 0x20 0x09)
echo "$reg_state"
:~/ $ 0x0a
但是,尽管地址读入正确,但是reg_state将保留十六进制扩展名“ 0x0”,这会妨碍操作。假设0x0a之前在寄存器中,并且我想在该值上加上“ 1”,该操作将无法完成。我认为这与我要达到目标的方式有关。现在,我的代码如下所示:
7 addition(){
8 reg_state=$(i2cget -y 1 0x20 0x09)
9 i=$(echo "obase=10; $reg_state"| bc)
10 write=$(i+adj )
}
...
25
26#Main Shell Script
27
28 op=$1
29 adj=$2
30 if [ $1 -gt 0 ]
31 then
32 addition
33 fi
我试图做的是在一个地址中读取寄存器的值,将其转换为十进制数字,然后将其与我想要的任何数字相加。但是,我注意到由于存在'0x',因此无法使用echo "obase=10; $reg_state | bc"
。当转换不带扩展名的十六进制数字时,一切正常,可以像往常一样添加它们。
话虽这么说,我仍然可以摆脱'0x'部分,只剩下剩下的东西,这样我就可以和平进行算术了吗?
即使对十六进制数字,您也不需要bc
进行整数数学运算。只需使用Shell算术扩展即可。例如,echo "$(( 0xA + 1))"
将显示11。如果您需要十六进制的结果:
printf "0x%X" $(( 0xA + 1))
将打印0xB。