Shell脚本中数值都是默认按照十进制处理的,除非这个数值做了特殊标记,如:以 0 开头就是 8 进制数,以0x 开头就是16 进制数。
1. 二进制、八进制、十六进制等转化为十进制
另外 BASE#NUMBER 这种形式可以表示其它进制,BASE值:2 ~ 64。
Shell
((num=0xff)); echo $num
255
((num=0123)); echo $num
83
echo $((0123))
83
((num=8#123)); echo $num
83
((num=64#123)); echo $num
4227
1
2
3
4
5
6
7
8
9
10
((num=0xff));echo$num
255
((num=0123));echo$num
83
echo$((0123))
83
((num=8#123)); echo $num
83
((num=64#123)); echo $num
4227
2. 使用bc工具来进行进制转换
我的经验是:一般先设置obase,再设置ibase,这样的话obase/ibase都可以按照默认的十进制来设置;否则先设置的ibase会对后面设置的obase参数生效(这个要注意)。
ibase 设置 input base,必须是 2 ~ 16 之间的数字;对于十六进制,ABCDEF等字母要大写。
obase 设置 output base,2-16进制就用普通的表示方法,如果大于16,则用多个字符来表示一个数字,数字之间用空格间隔。
Shell
Jay-Ali:~ jay$ echo "obase=16; ibase=10; 100" | bc
64
Jay-Ali:~ jay$ echo "obase=2; ibase=10; 100" | bc
1100100
Jay-Ali:~ jay$ echo "obase=16; ibase=2; 111111" | bc
3F
Jay-Ali:~ jay$ echo "obase=5; ibase=10; 100" | bc
400
1
2
3
4
5
6
7
8
Jay-Ali:~jay$echo"obase=16; ibase=10; 100"|bc
64
Jay-Ali:~jay$echo"obase=2; ibase=10; 100"|bc
1100100
Jay-Ali:~jay$echo"obase=16; ibase=2; 111111"|bc
3F
Jay-Ali:~jay$echo"obase=5; ibase=10; 100"|bc
400
3. 使用printf来进行8、10、16进制的转化
printf也是可以用来进行简单的进制转换的;它不支持输出二进制。
Shell
Jay-Ali:~ jay$ printf %d 100
100
Jay-Ali:~ jay$ printf %o 100
144
Jay-Ali:~ jay$ printf %x 100
64
Jay-Ali:~ jay$ printf %d 0x64
100
Jay-Ali:~ jay$ printf %d 0144
100
Jay-Ali:~ jay$ printf %X 255
FF
1
2
3
4
5
6
7
8
9
10
11
12
Jay-Ali:~jay$printf%d100
100
Jay-Ali:~jay$printf%o100
144
Jay-Ali:~jay$printf%x100
64
Jay-Ali:~jay$printf%d0x64
100
Jay-Ali:~jay$printf%d0144
100
Jay-Ali:~jay$printf%X255
FF