前一段时间受人之托,说是毕业设计非要用shell写个计算器,要支持四则运算的,刚开始觉得还容易,可发现四则的匹配还是比较繁琐的,在这里分享下吧~估计之后也不会出这样的毕业设计了

PS:赶时间写的,有bug的欢迎指正

 
  
  1. #!/bin/bash 
  2.  
  3. ## Calculator.sh ## 
  4. main() 
  5.     echo 'This is a Calculator:' 
  6.     echo 'example: 3 + 90 x ( 9 - 5 ) / 3 - 23'  
  7.     call 
  8.  
  9.  
  10. call() 
  11.     while [ 1 ];do 
  12.         read str 
  13.                 u=($str) 
  14.         g1='no' 
  15.         g2='no' 
  16.                 nu=`echo $str | awk '{print NF}'` 
  17.         for((i=0;i<$nu;i++));do 
  18.             echo ${u[$i]} | grep -E '^[1-9]|+|-|x|/|\(|\)' > /dev/null 
  19.             if (( $? == 0 ));then 
  20.                 echo ${u[$i]} |grep -E '\(|\)' > /dev/null 
  21.                                         if (( $? == 0 ));then 
  22.                                                 echo ${u[$i]} |grep -w '(' > /dev/null 
  23.                                                 if (( $? == 0 ));then 
  24.                             g1=$i 
  25.                             continue 
  26.                         fi 
  27.  
  28.                                                 echo ${u[$i]} |grep -w ')' > /dev/null 
  29.                                                 if (( $? == 0 ));then 
  30.                                                         g2=$i 
  31.                             if [ $g1 != 'no' ] || [ $g2 != 'no' ];then 
  32.                                             compute $g1 $g2 
  33.                                 u[$g1]=$? 
  34.                                 for((p=$g1+1;p<$g2+1;p++));do 
  35.                                     u[$p]='' 
  36.                                 done                                 
  37. #                               echo ${u[@]} 
  38.                                 nu3=`echo ${u[@]} | awk '{print NF}'` 
  39.                                 compute 0 $nu3 
  40.                                 echo $?  
  41.                                     fi 
  42.                             continue 
  43.                         fi 
  44.                     fi 
  45.                         else 
  46.                                 echo 'Error: is not digital' 
  47.             fi 
  48.         done 
  49.  
  50.         if [ $g1 = 'no' ] || [ $g2 = 'no' ];then 
  51.             compute 0 $nu 
  52.             echo $? 
  53.         fi 
  54.     done 
  55.  
  56. compute() 
  57.     s=(${u[@]}) 
  58.     for((k=$1;k<$2;k++));do 
  59.  
  60.         echo ${s[$k]} |grep -E 'x|/' > /dev/null 
  61.             if (( $? == 0 ));then 
  62.                 echo ${s[$k]} |grep -w 'x' > /dev/null 
  63.                 if (( $? == 0 ));then 
  64.                     sum=`expr ${s[$k-1]} \* ${s[$k+1]}` 
  65.                     s[$k+1]=$sum 
  66.                     s[$k]='' 
  67.                     s[$k-1]='' 
  68.                     continue 
  69.                 fi 
  70.  
  71.                                 echo ${s[$k]} |grep -w '/' > /dev/null 
  72.                                 if (( $? == 0 ));then 
  73.                                         sum=`expr ${s[$k-1]} \/ ${s[$k+1]}` 
  74.                     s[$k+1]=$sum 
  75.                                         s[$k]='' 
  76.                                         s[$k-1]='' 
  77.                                         continue 
  78.  
  79.                                  fi 
  80.             fi 
  81.         echo ${s[@]} |grep -E '+|-' > /dev/null 
  82.             if (( $? == 0 ));then 
  83.                 t=(${s[@]}) 
  84.                 nu2=`echo ${t[@]} | awk '{print NF}'` 
  85.                 for((j=$1;j<$2;j++));do 
  86.                         echo ${t[$j]} |grep -E '+|-' > /dev/null 
  87.                                 if (( $? == 0 ));then 
  88.                                     echo ${t[$j]} |grep -w '+' > /dev/null 
  89.                                         if (( $? == 0 ));then 
  90.                                             sum=`expr ${t[$j-1]} + ${t[$j+1]}` 
  91.                                                 t[$j+1]=$sum 
  92.                             t[$j]='' 
  93.                             t[$j-1]='' 
  94.                                                     continue 
  95.                                             fi 
  96.  
  97.                                             echo ${t[$j]} |grep -w '-' > /dev/null 
  98.                                             if (( $? == 0 ));then 
  99.                                                 sum=`expr ${t[$j-1]} - ${t[$j+1]}` 
  100.                                                     t[$j+1]=$sum 
  101.                                                     t[$j]='' 
  102.                                                     t[$j-1]='' 
  103.                                                     continue 
  104.                                             fi       
  105.                          
  106.                     fi 
  107.                 done 
  108.             fi 
  109.     done 
  110.     return $sum 

 

运行结果:

 
  
  1. zhangbo@ufo:~/me/shell$ ./Calculator.sh  
  2. This is a Calculator: 
  3. example: 3 + 90 x ( 9 - 5 ) / 3 - 23 
  4. 3 + 90 x ( 9 - 5 ) / 3 - 23        
  5. 100 
  6. 2 x ( 3 + 10 ) 
  7. 26