本文所選的例子來自于《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_BADARGS11 fi12 13 #如果參數非整數或參數值為0,以參數錯誤退出14 for i in $@15 do16 if [ $i=~[0-9]+ ] #"=~"后面表示要跟正則表達式,+在正則表達式中表示前面的內容至少匹配一次17 then18 if [ $i -eq 0 ]19 then20 echo "Usage: `basename $0` parameter can't be zero"21 exit $E_BADARGS22 fi23 else24 echo "Usage: `basename $0` parameter must be integer"25 exit $E_BADARGS26 fi27 done28 29 #設計一個gcd()函數,利用輾轉相除法(歐幾里德算法)求最大公約數30 gcd()31 {32 remainder=133 dividend=$134 divisor=$235 36 until [ $remainder -eq 0 ]37 do38 let "remainder=$dividend % $divisor"39 dividend=$divisor40 divisor=$remainder41 done42 }43 44 gcd $1 $245 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
先看$1>$2的情況
$1=65 $2=15
第一個循環:5=65 % 15
dividend=15
divisor=5
第二次循環 0=15%5
dividend=5
divisor=0
退出循環,gcd=$dividend=5
再看$1
$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的情況多了一個循環,結果是一樣的
? ??
?
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END