经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
Shell脚本之进制转换器的实现
来源:jb51  时间:2023/3/24 9:01:27  对本文有异议

一、需求说明

计算IP地址我们经常需要将十进制和二进制数值之间进行转换,实际上进制之间转换通过bc命令就可以完成。此进制转换器shell脚本就是利用bc进制转换功能来实现我们的需求,并做了一些完善,例如bc要求十六进制字符为大写,脚本进行了优化输入大小写都可以。脚本针对输入的数值进行了校验,如果数值格式输入错误,会报错提示。bc命令的安装和使用见博文Linux命令之bc命令

二、脚本内容

  1. #!/bin/bash
  2. #script name: conversion.sh
  3. #author: wuhs
  4. #description: 此脚本用于二进制和十进制之间的转换
  5. #date: 2022-05-09
  6.  
  7. #参数定义
  8. #进制转换类型参数
  9. f=$1
  10. #待转换数值参数
  11. d=$2
  12.  
  13. case $1 in
  14. ? 2to10)
  15. ? ? if echo $d |grep -E "^[0,1]*$" >/dev/null;then
  16. ? ? ? echo "obase=10;ibase=2;$d" |bc
  17. ? ? else
  18. ? ? ? echo "参数2要求输入二进制数"
  19. ? ? fi
  20. ? ;;
  21. ? 10to2)
  22. ? ? if echo $d |grep -E "^[0-9]*$" >/dev/null;then
  23. ? ? ? echo "obase=2;ibase=10;$d" |bc
  24. ? ? else
  25. ? ? ? echo "参数2要求输入十进制整数"
  26. ? ? fi
  27. ? ;;
  28. ? 8to10)
  29. ? ? if echo $d |grep -E "^[01234567]*$" >/dev/null;then
  30. ? ? ? echo "obase=10;ibase=8;$d" |bc
  31. ? ? else
  32. ? ? ? echo "参数2要求输入八进制字符"
  33. ? ? fi
  34. ? ;;
  35. ? 10to8)
  36. ? ? if echo $d |grep -E "^[0-9]*$" >/dev/null;then
  37. ? ? ? echo "obase=8;ibase=10;$d" |bc
  38. ? ? else
  39. ? ? ? echo "参数2要求输入十进制整数"
  40. ? ? fi
  41. ? ;;
  42. ? 16to10)
  43. ? ? if echo $d |grep -E "^[0-9A-Fa-f]*$" >/dev/null;then
  44. ? ? ? d=`echo $d |tr a-z A-Z`
  45. ? ? ? echo "obase=10;ibase=16;$d" |bc
  46. ? ? else
  47. ? ? ? echo "参数2要求输入十六进制字符"
  48. ? ? fi
  49. ? ;;
  50. ? 10to16)
  51. ? ? if echo $d |grep -E "^[0-9]*$" >/dev/null;then
  52. ? ? ? echo "obase=16;ibase=10;$d" |bc
  53. ? ? else
  54. ? ? ? echo "参数2要求输入十进制整数"
  55. ? ? fi
  56. ? ;;
  57. ? 2to8)
  58. ? ? if echo $d |grep -E "^[0,1]*$" >/dev/null;then
  59. ? ? ? echo "obase=8;ibase=2;$d" |bc
  60. ? ? else
  61. ? ? ? echo "参数2要求输入二进制数"
  62. ? ? fi
  63. ? ;;
  64. ? 8to2)
  65. ? ? if echo $d |grep -E "^[01234567]*$" >/dev/null;then
  66. ? ? ? echo "obase=2;ibase=8;$d" |bc
  67. ? ? else
  68. ? ? ? echo "参数2要求输入八进制字符"
  69. ? ? fi
  70. ? ;;
  71. ? 2to16)
  72. ? ? if echo $d |grep -E "^[0,1]*$" >/dev/null;then
  73. ? ? ? echo "obase=16;ibase=2;$d" |bc
  74. ? ? else
  75. ? ? ? echo "参数2要求输入二进制数"
  76. ? ? fi
  77. ? ;;
  78. ? 16to2)
  79. ? ? if echo $d |grep -E "^[0-9A-Fa-f]*$" >/dev/null;then
  80. ? ? ? d=`echo $d |tr a-z A-Z`
  81. ? ? ? echo "obase=2;ibase=16;$d" |bc
  82. ? ? else
  83. ? ? ? echo "参数2要求输入十六进制字符"
  84. ? ? fi
  85. ? ;;
  86. ? 8to16)
  87. ? ? if echo $d |grep -E "^[01234567]*$" >/dev/null;then
  88. ? ? ? echo "obase=16;ibase=8;$d" |bc
  89. ? ? else
  90. ? ? ? echo "参数2要求输入八进制字符"
  91. ? ? fi
  92. ? ;;
  93. ? 16to8)
  94. ? ? if echo $d |grep -E "^[0-9A-Fa-f]*$" >/dev/null;then
  95. ? ? ? d=`echo $d |tr a-z A-Z`
  96. ? ? ? echo "obase=8;ibase=16;$d" |bc
  97. ? ? else
  98. ? ? ? echo "参数2要求输入十六进制字符"
  99. ? ? fi
  100. ? ;;
  101. ? *)
  102. ? ? echo "参数1输入错误"
  103. ? ? exit
  104. ? ;;
  105. esac

三、使用示例

1、二进制转换为十进制

  1. [root@s146 ipcheck]# ./conversion.sh 2to10 1001
  2. 9
  3. [root@s146 ipcheck]# ./conversion.sh 2to10 1003
  4. 参数2要求输入二进制数

2、十进制转换为二进制

  1. [root@s146 ipcheck]# ./conversion.sh 10to2 255
  2. 11111111
  3. [root@s146 ipcheck]# ./conversion.sh 10to2 255A
  4. 参数2要求输入十进制整数

3、八进制转换为十进制

  1. [root@s146 ipcheck]# ./conversion.sh 8to10 71
  2. 57
  3. [root@s146 ipcheck]# ./conversion.sh 8to10 81
  4. 参数2要求输入八进制字符

4、十进制转换为八进制

  1. [root@s146 ipcheck]# ./conversion.sh 10to8 59
  2. 73
  3. [root@s146 ipcheck]# ./conversion.sh 10to8 591
  4. 1117
  5. [root@s146 ipcheck]# ./conversion.sh 10to8 591A
  6. 参数2要求输入十进制整数

5、十六进制转换为十进制

  1. [root@s146 ipcheck]# ./conversion.sh 16to10 A
  2. 10
  3. [root@s146 ipcheck]# ./conversion.sh 16to10 X
  4. 参数2要求输入十六进制字符
  5. [root@s146 ipcheck]# ./conversion.sh 16to10 G
  6. 参数2要求输入十六进制字符
  7. [root@s146 ipcheck]# ./conversion.sh 16to10 abc
  8. 2748

6、十进制转换为八进制

  1. [root@s146 ipcheck]# ./conversion.sh 10to16 2748
  2. ABC
  3. [root@s146 ipcheck]# ./conversion.sh 10to16 17
  4. 11
  5. [root@s146 ipcheck]# ./conversion.sh 10to16 15
  6. F

7、二进制转换为八进制

  1. [root@s146 ipcheck]# ./conversion.sh 2to8 1011
  2. 13
  3. [root@s146 ipcheck]# ./conversion.sh 2to8 1011.
  4. 参数2要求输入二进制数

8、八进制转换为二进制

  1. [root@s146 ipcheck]# ./conversion.sh 8to2 31
  2. 11001
  3. [root@s146 ipcheck]# ./conversion.sh 8to2 31a
  4. 参数2要求输入八进制字符

9、八进制转换为十六进制

  1. [root@s146 ipcheck]# ./conversion.sh 8to16 13
  2. B
  3. [root@s146 ipcheck]# ./conversion.sh 8to16 12
  4. A
  5. [root@s146 ipcheck]# ./conversion.sh 8to16 12c
  6. 参数2要求输入八进制字符

10、十六进制转换为八进制

  1. [root@s146 ipcheck]# ./conversion.sh 16to8 C
  2. 14
  3. [root@s146 ipcheck]# ./conversion.sh 16to8 c
  4. 14
  5. [root@s146 ipcheck]# ./conversion.sh 16to8 c1d
  6. 6035
  7. [root@s146 ipcheck]# ./conversion.sh 16to8 c1dg
  8. 参数2要求输入十六进制字符

11、禁止转换参数输入错误

到此这篇关于Shell脚本之进制转换器的实现的文章就介绍到这了,更多相关Shell 进制转换器内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号