歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 網絡地址計算(Linux版)

網絡地址計算(Linux版)

日期:2017/3/1 10:29:36   编辑:Linux編程
  1. #!/bin/bash
  2. #History:
  3. # 2012-02-20 DanielW|Kernel First release
  4. #
  5. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH
  6. #二進制轉十進制
  7. function multiply_2(){
  8. declare -i n
  9. n=$1
  10. multiply_result=1
  11. while [ $n -gt 0 ]
  12. do
  13. multiply_result=$(( $multiply_result*2 ))
  14. n=$n-1
  15. done
  16. export multiply_result
  17. }
  18. ##十進制轉二進制,得出ip和mask的某一段的二進制
  19. function cal(){
  20. declare -i a
  21. declare -i b
  22. declare -i len
  23. a=$1
  24. b=$2
  25. m=""
  26. n=""
  27. m=$(( a%2 ))
  28. while [ $(( a/2 )) -gt 0 ]
  29. do
  30. a=$(( a/2 ))
  31. m=$((a%2))$m
  32. done
  33. len=8-$( expr length $m )
  34. while [ $len -gt 0 ]
  35. do
  36. m=0$m
  37. len=$(( len-1 ))
  38. done
  39. n=$(( b%2 ))
  40. while [ $(( b/2 )) -gt 0 ]
  41. do
  42. b=$(( b/2 ))
  43. n=$((b%2))$n
  44. done
  45. len=8-$(expr length $n)
  46. while [ $len -gt 0 ]
  47. do
  48. n=0$n
  49. len=$(( len-1 ))
  50. done
  51. export m
  52. export n
  53. }
  54. #做與運算,並輸出十進制
  55. function ip_and_mask(){
  56. declare -i int
  57. ten=""
  58. ip="0"
  59. int=8
  60. a=""
  61. b=""
  62. result=""
  63. while [ $int -gt 0 ]
  64. do
  65. a=$( expr substr $1 $int 1 )
  66. b=$( expr substr $2 $int 1 )
  67. if [ "$a" == "1" -a "$b" == "1" ];then
  68. result=1${result}
  69. else result=0${result}
  70. fi
  71. int=$int-1
  72. done
  73. if [ "$( expr substr $result 8 1 )" == "1" ];then
  74. ip=1
  75. else ip=0
  76. fi
  77. int=7
  78. while [ $int -ge 0 ]
  79. do
  80. if [ "$( expr substr $result $int 1 )" == "1" ];then
  81. tmp_n=$(( 8-int ))
  82. ip=$(( ip+$( multiply_2 $tmp_n ) ))
  83. fi
  84. int=$int-1
  85. done
  86. export ip
  87. }
  88. read -p "Enter the IP Address:" ip_input
  89. read -p "Enter the NETMASK Address:" mask
  90. declare -i M1=$( echo $mask | awk 'BEGIN{FS="."}{print $1}' )
  91. declare -i M2=$( echo $mask | awk 'BEGIN{FS="."}{print $2}' )
  92. declare -i M3=$( echo $mask | awk 'BEGIN{FS="."}{print $3}' )
  93. declare -i M4=$( echo $mask | awk 'BEGIN{FS="."}{print $4}' )
  94. declare -i P1=$( echo $ip_input | awk 'BEGIN{FS="."}{print $1}' )
  95. declare -i P2=$( echo $ip_input | awk 'BEGIN{FS="."}{print $2}' )
  96. declare -i P3=$( echo $ip_input | awk 'BEGIN{FS="."}{print $3}' )
  97. declare -i P4=$( echo $ip_input | awk 'BEGIN{FS="."}{print $4}' )
  98. if [ $M1 -ne 255 ];then
  99. cal $M1 $P1
  100. ip_and_mask $m $n
  101. echo -e "Net Address:"$ip.0.0.0
  102. elif [ $M2 -ne 255 ];then
  103. cal $M2 $P2
  104. ip_and_mask $m $n
  105. echo "Net Address:"$P1.$ip.0.0
  106. elif [ $M3 -ne 255 ];then
  107. cal $M3 $P3
  108. ip_and_mask $m $n
  109. echo "Net Address:"$P1.$P2.$ip.0
  110. else [ $M4 -ne 255 ]
  111. cal $M4 $P4
  112. ip_and_mask $m $n
  113. echo "Net Address:"$P1.$P2.$P3.$ip
  114. fi
  115. echo "END"

這個版本還沒有對輸入的數據進行判斷,而且沒有使用位運算(原來不會啊),導致了代碼過長過復雜,等待下個版本更新。

這裡還有一個可以自動獲取主機網絡地址判斷的腳本 http://www.linuxidc.com/Linux/2012-02/55060p2.htm

Copyright © Linux教程網 All Rights Reserved