本文所選的例子來自於《Advanced Bash-scripting Gudie》一書,譯者 楊春敏 黃毅 在改編這個腳本的時候,我的考慮點主要有以下: 1. 所傳的參數是不是要排除非整數的情況? 非整數的情況第一次我用echo $i | sed '/s/^[0-9]*$/''/g' && echo ...
本文所選的例子來自於《Advanced Bash-scripting Gudie》一書,譯者 楊春敏 黃毅
1 #!/bin/bash 2 #求兩個整數的最大公約數 3 4 E_BADARGS=65 5 6 #如果參數個數不為2,以參數錯誤退出 7 if [ $# -ne 2 ] 8 then 9 echo "Usage: `basename $0` first-number second-number" 10 exit $E_BADARGS 11 fi 12 13 #如果參數非整數或參數值為0,以參數錯誤退出 14 for i in $@ 15 do 16 if [ $i=~[0-9]+ ] #"=~"後面表示要跟正則表達式,+在正則表達式中表示前面的內容至少匹配一次 17 then 18 if [ $i -eq 0 ] 19 then 20 echo "Usage: `basename $0` parameter can't be zero" 21 exit $E_BADARGS 22 fi 23 else 24 echo "Usage: `basename $0` parameter must be integer" 25 exit $E_BADARGS 26 fi 27 done 28 29 #設計一個gcd()函數,利用輾轉相除法(歐幾里德演算法)求最大公約數 30 gcd() 31 { 32 remainder=1 33 dividend=$1 34 divisor=$2 35 36 until [ $remainder -eq 0 ] 37 do 38 let "remainder=$dividend % $divisor" 39 dividend=$divisor 40 divisor=$remainder 41 done 42 } 43 44 gcd $1 $2 45 46 echo "gcd of $1 and $2 is: $devidend" 47 48 exit 0
在改編這個腳本的時候,我的考慮點主要有以下:
1. 所傳的參數是不是要排除非整數的情況?
非整數的情況第一次我用echo $i | sed '/s/^[0-9]*$/''/g' && echo $?來排除,如果第一條命令正確執行,$?應該返回0,但是我們有更好的方法,即“=~"後面跟正則的方式
2. 參數值為0的情況是不是要排除在外?
在判斷$i為整數的判斷下再嵌套一個判斷[ $i -eq 0 ]
3. 參數個數怎麼控制?
[ $# -eq 2 ]或[ $# -ne 2 ]就可以排除空參數或參數個數不為2
4. 歐幾里德演算法中對於$1<$2的情況的處理?
先看$1>$2的情況
$1=65 $2=15
第一個迴圈:5=65 % 15
dividend=15
divisor=5
第二次迴圈 0=15%5
dividend=5
divisor=0
退出迴圈,gcd=$dividend=5
再看$1<$2的情況
$1=15 $2=65
第一次迴圈:15=15 % 65
dividend=65
divisor=15
第二次迴圈:5=65 % 15
dividend=15
divisor=5
第三次迴圈:0=15 % 5
dividend=5
divisor=0
退出迴圈,gcd=$dividend=5
可知$1<$2的情況比$1>$2的情況多了一個迴圈,結果是一樣的