【正文】
”${result?}” fi echo $result} 腳本標(biāo)志參數(shù)處理命令: getopts “” var 帶兩個(gè)參數(shù),第一個(gè)參數(shù)為帶解析的 參數(shù)標(biāo)志序列串(如f,c等), 以冒號(hào)(:)分隔各標(biāo)志,且以冒號(hào):結(jié)束 第二個(gè)參數(shù)為:變量,每執(zhí)行一次存放 參數(shù)標(biāo)志序列串中的一個(gè)標(biāo)志字符 返回值:未解析結(jié)束返回0,解析結(jié)束返回1 涉及的內(nèi)定變量:$OPTARG 每次解析標(biāo)志對(duì)應(yīng)的參數(shù)值 便默認(rèn)存放在此變量?jī)?nèi)。 $OPTIND 當(dāng)各標(biāo)志處理無誤情況下,該數(shù)值指示當(dāng)前用到的最大位置參數(shù)($)。 此值使用容易出錯(cuò)(若參數(shù)的判斷不完善時(shí)), 還不如用 $ 另外 $1, $2, $3, $4, === 此時(shí) $ 等于 4,當(dāng)執(zhí)行shift 1 時(shí), 各個(gè)位置參數(shù)的值向一次向左右1次,此時(shí) $1的值 為原$2的值當(dāng)執(zhí)行shift 2 時(shí), 各個(gè)位置參數(shù)的值向一次向左右2次,此時(shí) $1的值 為原$3的值。 完整代碼 nicenumber() ..... 函數(shù)實(shí)現(xiàn)部分 處理腳本標(biāo)志參數(shù) while getopts “d:t:” opt do case $opt in $opt 為 具體的標(biāo)志字符 d ) DD=”$OPTARG” 。 $OPTARG 為標(biāo)志指定的參數(shù)值 t ) TD=”$OPTARG” 。 * ) echo “no argflag: $opt” amp。2 。 exit 1esacdone 當(dāng)腳本接收如此多的參數(shù)時(shí),$1將不代表腳本最終要處理的大數(shù)字,所以做如下操作。shift $(($OPTIND 1)) nicenumber $1exit 0擴(kuò)展:,使腳本能夠處理各種整數(shù)與小數(shù)各種分隔符情況。在傳給腳本參數(shù)時(shí)需指定標(biāo)志d程序中僅需在 分隔 整數(shù)與小數(shù)部分略修改為 integer=$(echo $1 | cut “–d${DD:=”.”” –f1 ) decimal=$(echo $1 | cut “–d$DD” –f2 ),可以在程序執(zhí)行之前分別初始化DD,TD默認(rèn)值。3. 檢測(cè)傳給腳本的大數(shù)值中是否含有 非法的整小數(shù)分隔符,即存在與用戶指定或默認(rèn)分隔符不同的符號(hào)。 方法:刪除其中所有數(shù)字,看剩下的內(nèi)容,若不空且不等于$DD,則非法 separator=”$(echo $1 | sed ‘s/[[:digit:]]//g’)” if [ n $separator amp。amp。 “$separator” != “$DD” ]。then 藍(lán)色部分可用 –a 表示 exit 1 fi5. 檢測(cè) 輸入整數(shù)的合法性,可負(fù)數(shù)(1, 2均合法), 可以指定傳入整數(shù)范圍,不在范圍內(nèi)則報(bào)錯(cuò)。參數(shù):1或3個(gè), 當(dāng)3個(gè)時(shí),后兩個(gè)為范圍。合法性:正負(fù)數(shù)的判斷,范圍的判斷。validint(){ integer=$1 min=$2 max=$3 判斷傳參的合法性,以下判斷是錯(cuò)誤的,因?yàn)椴还軈?shù)是否為空,實(shí)際上都傳了三個(gè)參數(shù)。 if [ $ eq 0 ]。then 改成判斷$1的內(nèi)容是否為空,就可以了 echo “you couldn’t do nothing”amp。2 return 1 fi 判斷是否為負(fù)數(shù),第一個(gè)字符 是否為 –, 如是,則判斷后面的是否為整數(shù)。若非負(fù),則判斷是否為整數(shù)if [ “$(echo $1 | cut –c1)” = “” ]。 then signed=”” integer=”${integer?}” fi 如果就是一個(gè)符號(hào) ,則也是非法的 if [ z “$integer” ]。 then echo “Invalid input, just a “” is not allowed”amp。2 注意:amp。2 三個(gè)字符緊連。 return 1 fi 如果非純數(shù)字構(gòu)成,則非法。 if [ n “$(echo $integer | sed ‘s/[[:digit:]]//g’)” ] 。 then echo “Invalid integer, it includes some char but digit”amp。2 return 1 fi integer=”$signed$integer” 范圍判斷,注意當(dāng) min 和 max 為空時(shí)(即未傳范圍),我設(shè)定其為$integer,如此判斷就不會(huì)出錯(cuò)。 if [ $integer –lt ${min:=$ingeger} ]。then echo “$integer is too small, it should greater than $min”amp。2 return 1 fi if [ $integer –gt ${max:=$integer} ]。then echo “$integer is too large, it should little than $max”amp。2 return 1 fi return 0}執(zhí)行代碼!/bin/bashvalidint() .....if validint “$1” “$2” “$3”。 thenecho “your input is valide”fi注:if [ ! z $min a $number lt $min ] 為AND表達(dá)式,但在shall腳本中,當(dāng)?shù)谝粋€(gè)條件為false時(shí),不能保證第二個(gè)條件不被測(cè)。 而將if條件改寫成兩層嵌套的if語句后,當(dāng)?shù)谝粋€(gè)為false時(shí),則第二個(gè)一個(gè)不會(huì)被測(cè)。6. 檢測(cè)浮點(diǎn)數(shù)的合法性。參數(shù):1個(gè)浮點(diǎn)數(shù) 合法性: 不支持科學(xué)表示法,支持帶符號(hào) 。思路:首先要判斷是整數(shù)還是浮點(diǎn)數(shù),只是一種可能性的判斷,即判斷有沒有 點(diǎn)有點(diǎn)的情況:依據(jù)“.”劈成兩半,前半為合法整數(shù)。后半必須為 =0 的整數(shù)。需調(diào)用上一例中的判斷整數(shù)合法性的validint()函數(shù)無點(diǎn)的情況:基本做整數(shù)判斷處理函數(shù): validfloat(){ fvalue=$1 保證傳入?yún)?shù)非空 if [ z “$fvalue” ] 。 then echo “you input nothing”amp。2 return 1 fi 判斷有點(diǎn)否?(清除點(diǎn)以外的字符,看看結(jié)果是否為空) if [ n $(echo $fvalue | sed ‘s/[^.]//g’) ] 。 then integer=”$(echo $fvalue | cut –d. f1 )” decimal=”$(echo $fvalue | cut –d. f2 )” //判斷整數(shù)部分的合法性,當(dāng)僅為 – 時(shí),把它看成0,免去判斷 if [ “$integer” != “” ] 。 then if ! validint “$integer” 。 then echo “part before dot $integer is not valide!”amp。2 return 1 fi fi //判斷小數(shù)部分整數(shù)的合法性。必須=0, 當(dāng)為空時(shí)不判斷。 if [ n “$decimal” ] 。 then if ! validint “$decimal” 0 。 then echo “part after dot $decimal is not valide!”amp。2 return 1 fi fi else 沒有點(diǎn),就當(dāng)作整數(shù)處理 if validint “fvalue” 。 then echo “your input is a integer”amp。2 return 1 fi fi}完整代碼 validfloat !/bin/bash. validint 引用別的文件定義的函數(shù)。validfloat() .... 實(shí)現(xiàn)部分if validfloat $1 。 then echo “$1 is a valid floatingpoint value”fiexit 0