典型狀況是,你或許會碰見文件名或是數據庫的鍵。你提示用戶要輸入一個所有由大小寫字母和數字組成的字符串,沒有標點,沒有特殊字符,沒有空格。他們是否輸入正確了?這就是這個腳本要測試的內容。 shell
validAlphaNum.sh # validAlphaNum.sh - 確保輸入只由數字、字母構成 #!/bin/sh validAlphaNum() { # 合法化參數:都是大寫字母+小寫字母+數字,返回0;不然,返回1 # 刪除全部不可接受的字符 compressed="$(echo $1 | sed -e 's/[^[:alnum:]]//g')" if [ "$compressed" != "$input" ]; then return 1 else return 0 fi }該函數的示例用法。下面的代碼直接添加到 validAlphaNum.sh中:
validAlphaNum.sh echo -n "輸入:" read input if ! validAlphaNum "$input"; then echo "輸入只能是字母和數字。" >&2 exit 1 else echo "輸入合法。" fi exit 0
腳本分析:
腳本的邏輯是很明確的。首先,它用sed將輸入轉換爲全新的。而後,比較了新的數據和原始的。若是2個徹底相同,那麼很是完美。不然,轉換中丟失的數據就不屬於字符數字的集合,因此原始輸入時非法的。
sed的特殊做用是處理不在POSIX字符類[:alnum:]中的數據。該字符類是全部大寫字母、小寫字母、數字的集合。若是sed處理後的數據並不匹配以前的輸入,那麼全部字母數字的移動揭示了這樣一個問題:在輸入字符串(非法的)中有非數字字母的存在,而後函數會返回一個非0值。 數據庫
運行腳本:
這個腳本自己是完備的。它會提示輸入,並通知你結果是否合法。這個函數的更典型的用法是放在一個腳本或者一個庫的頭部。會在第12個腳本中演示。
這個腳本展現了一個很是好的通常性的shell腳本編程技術:先寫下一個函數,而後緊接着就測試下。完畢後,再把這個函數放到一個更大、更完備的腳本中。這樣,會給你之後省下很多事。 編程
結果: 函數
./validAlphaNum.sh 輸入:valid123SAMPLE 輸入合法。
./validAlphaNum.sh 輸入:this is most assuredly NOT valid, 12345 輸入只能是字母和數字。