Shell指令碼測試合法化輸入 合法化輸入:只允許數字和字母 使用者常常會忽略掉說明,並且輸入錯誤的資料。作為一個Shell指令碼開發人員,你需要攔截並糾正這些錯誤。 典型情況是,你或許會遇見檔案名稱或是資料庫的鍵。你提示使用者要輸入一個全部由大小寫字母和數字組成的字串,沒有標點,沒有特殊字元,沒有空格。他們是否輸入正確了?這就是這個指令碼要測試的內容。 01validAlphaNum.sh02 # validAlphaNum.sh - 確保輸入只由數字、字母構成03 04 #!/bin/sh05 06 validAlphaNum()07 {08 # 合法化參數:都是大寫字母+小寫字母+數字,返回0;否則,返回109 10 # 刪除所有不可接受的字元11 compressed="$(echo $1 | sed -e 's/[^[:alnum:]]//g')"12 13 if [ "$compressed" != "$input" ]; then14 return 115 else16 return 017 fi18 }該函數的樣本用法。下面的代碼直接添加到 validAlphaNum.sh中: 01validAlphaNum.sh02 echo -n "輸入:"03 read input04 05 if ! validAlphaNum "$input"; then06 echo "輸入只能是字母和數字。" >&207 exit 108 else09 echo "輸入合法。"10 fi11 12 exit 0指令碼分析: 指令碼的邏輯是很明確的。首先,它用sed將輸入轉換為全新的。然後,比較了新的資料和原始的。如果2個完全相同,那麼非常完美。否則,轉換中丟失的資料就不屬於字元數位集合,所以原始輸入時非法的。 sed的特殊作用是處理不在POSIX字元類[:alnum:]中的資料。該字元類是所有大寫字母、小寫字母、數位集合。如果sed處理後的資料並不匹配之前的輸入,那麼所有字母數位移動揭示了這樣一個問題:在輸入字串(非法的)中有非數字字母的存在,然後函數會返回一個非0值。 運行指令碼: 這個指令碼本身是完備的。它會提示輸入,並通知你結果是否合法。這個函數的更典型的用法是放在一個指令碼或者一個庫的頭部。會在第12個指令碼中示範。 這個指令碼展示了一個非常好的一般性的shell指令碼編程技術:先寫下一個函數,然後緊接著就測試下。完畢後,再把這個函數放到一個更大、更完備的指令碼中。這樣,會給你以後省下不少事。 結果: ./validAlphaNum.sh 輸入:valid123SAMPLE輸入合法。./validAlphaNum.sh 輸入:this is most assuredly NOT valid, 12345 輸入只能是字母和數字。