痴心VS绝对 发表于 2018-8-22 09:02:43

Linux shell 进制转换

  源地址链接:http://blog.csdn.net/axdc_qa_team/article/details/6090182
  既然有需要,就把搜到感觉有用的进制转换函数或指令都贴在这里,便于以后应用。
  shell可以在不调用第3方命令,表示不同进制数据。这里总结以下表示方法。shell 脚本默认数值是由10进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值。如:以 0 开头就是 8 进制.以0x 开头就是16进制数.使用 BASE#NUMBER 这种形式可以表示其它进制.BASE值:2-64.
  使用方法:

[*]其它进制转为10进制
  八进制转十进制:
  $ ((num=0123));
  $ echo $num;
  83
  $ ((num=8#123));
  $ echo $num;
  83
  ((表达式)),(())里面可以是任意数据表达式。如果前面加入:”$”可以读取计算结果。
  十六进制转十进制:
  $ ((num=0xff));
  $ echo $num;
  255
  $ ((num=16#ff));
  $ echo $num;
  255
  base-32转十进制:
  $ ((num=32#ffff));
  $ echo $num;
  507375
  base64转十进制:
  $ ((num=64#abc_));
  $ echo $num;
  2667327
  二进制转十进制
  $ ((num=2#11111111));
  $ echo $num;
  255


[*]十进制转为其它进制
  十进制转八进制
  这里使用到:bc外部命令完成。bc命令格式转换为:echo "obase=进制;值"|bc
  $ echo "obase=8;01234567"|bc
  4553207
  二进制,十六进制,base64转换为 十进制也相同方法。
  $ echo "obase=64;123456"|bc
  30 09 00
  shell,内置各种进制表示方法非常简单。记得base#number 即可。这里记得赋值时候用(())符号。不能直接用=号了。=号没有值类型。默认将后面变成字符串了。如:
  $ num=0123;
  $ echo $num;
  0123
  0开头已经失去了意义了。
  可以通过定义符:let达到(()) 运算效果。
  $ let num=0123;
  $ echo $num;
  83
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  Example 12-46 将10进制数字转换为16进制数字
  ################################Start Script#######################################
  1 #!/bin/bash
  2 # hexconvert.sh: 将10进制数字转换为16进制数字
  3
  4 E_NOARGS=65 # 缺命令行参数错误.
  5 BASE=16   # 16进制.
  6
  7 if [ -z "$1" ]
  8 then
  9   echo "Usage: $0 number"
  10   exit $E_NOARGS
  11   # 需要一个命令行参数.
  12 fi
  13 # 练习: 添加命令行参数检查.
  14
  15
  16 hexcvt ()
  17 {
  18 if [ -z "$1" ]
  19 then
  20   echo 0
  21   return    # 如果没有参数传递到这个函数中就 "return" 0.
  22 fi
  23
  24 echo ""$1" "$BASE" o p" | dc
  25 #               "o" 设置输出的基数(数制).
  26 #                   "p" 打印栈顶.
  27 # 察看 dc 的 man 页来了解其他的选项.
  28 return
  29 }
  30
  31 hexcvt "$1"
  32
  33 exit 0

页: [1]
查看完整版本: Linux shell 进制转换