网络地址计算(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. #二进制转十进制  
  8. function multiply_2(){  
  9.         declare -i n  
  10.         n=$1  
  11.   
  12.         multiply_result=1  
  13.         while [ $n -gt 0 ]  
  14.         do   
  15.                 multiply_result=$(( $multiply_result*2 ))  
  16.                 n=$n-1  
  17.         done  
  18.                 export multiply_result  
  19. }  
  20.   
  21. ##十进制转二进制,得出ip和mask的某一段的二进制  
  22. function cal(){  
  23. declare -i a  
  24. declare -i b  
  25. declare -i len  
  26. a=$1  
  27. b=$2  
  28. m=""  
  29. n=""  
  30.   
  31. m=$(( a%2 ))  
  32. while [ $(( a/2 )) -gt 0 ]   
  33. do  
  34.         a=$(( a/2 ))  
  35.         m=$((a%2))$m  
  36. done     
  37. len=8-$( expr length $m )  
  38. while [ $len -gt 0 ]   
  39. do  
  40.         m=0$m     
  41.         len=$(( len-1 ))  
  42. done  
  43. n=$(( b%2 ))  
  44. while [ $(( b/2 )) -gt 0 ]   
  45. do  
  46.         b=$(( b/2 ))  
  47.         n=$((b%2))$n  
  48. done     
  49. len=8-$(expr length $n)  
  50. while [ $len -gt 0 ]   
  51. do  
  52.         n=0$n     
  53.         len=$(( len-1 ))  
  54. done  
  55. export m  
  56. export n          
  57. }  
  58.   
  59. #做与运算,并输出十进制  
  60. function ip_and_mask(){  
  61. declare -i int  
  62. ten=""  
  63. ip="0"  
  64. int=8  
  65. a=""  
  66. b=""  
  67. result=""  
  68. while [ $int -gt 0 ]   
  69. do  
  70.         a=$( expr substr $1 $int 1 )  
  71.         b=$( expr substr $2 $int 1 )  
  72.         if [ "$a" == "1" -a "$b" == "1" ];then  
  73.                 result=1${result}  
  74.         else result=0${result}  
  75.         fi        
  76.         int=$int-1  
  77. done  
  78.   
  79. if [ "$( expr substr $result 8 1 )" == "1" ];then  
  80.         ip=1  
  81. else ip=0  
  82. fi  
  83. int=7  
  84. while [ $int -ge 0 ]  
  85. do  
  86.         if [ "$( expr substr $result $int 1 )" == "1" ];then  
  87.                 tmp_n=$(( 8-int ))   
  88.                 ip=$(( ip+$( multiply_2 $tmp_n ) ))   
  89.         fi   
  90.         int=$int-1  
  91. done  
  92. export ip  
  93. }  
  94.   
  95. read -p "Enter the IP Address:" ip_input  
  96. read -p "Enter the NETMASK Address:" mask  
  97. declare -i M1=$( echo $mask | awk 'BEGIN{FS="."}{print $1}' )  
  98. declare -i M2=$( echo $mask | awk 'BEGIN{FS="."}{print $2}' )  
  99. declare -i M3=$( echo $mask | awk 'BEGIN{FS="."}{print $3}' )  
  100. declare -i M4=$( echo $mask | awk 'BEGIN{FS="."}{print $4}' )  
  101. declare -i P1=$( echo $ip_input | awk 'BEGIN{FS="."}{print $1}' )  
  102. declare -i P2=$( echo $ip_input | awk 'BEGIN{FS="."}{print $2}' )  
  103. declare -i P3=$( echo $ip_input | awk 'BEGIN{FS="."}{print $3}' )  
  104. declare -i P4=$( echo $ip_input | awk 'BEGIN{FS="."}{print $4}' )  
  105. if [ $M1 -ne 255 ];then  
  106.         cal $M1 $P1  
  107.         ip_and_mask $m $n  
  108.         echo -e "Net Address:"$ip.0.0.0  
  109. elif [ $M2 -ne 255 ];then  
  110.         cal $M2 $P2  
  111.         ip_and_mask $m $n  
  112.         echo "Net Address:"$P1.$ip.0.0  
  113. elif [ $M3 -ne 255 ];then  
  114.         cal $M3 $P3  
  115.         ip_and_mask $m $n  
  116.         echo "Net Address:"$P1.$P2.$ip.0  
  117. else [ $M4 -ne 255 ]  
  118.         cal $M4 $P4  
  119.         ip_and_mask $m $n  
  120.         echo "Net Address:"$P1.$P2.$P3.$ip  
  121. fi  
  122. echo "END"  

这个版本还没有对输入的数据进行判断,而且没有使用位运算(原来不会啊),导致了代码过长过复杂,等待下个版本更新。

这里还有一个可以自动获取主机网络地址判断的脚本

  • 1
  • 2
  • 下一页

相关内容