合法化整型輸入指令碼 正確化整型輸入看起來非常簡單,除非你想要確保負數也能作為輸入。問題就在於每一個數值只能有一個負號,且必須出現在數位頭部。本指令碼中的糾正程式能保證負數也能被正確的格式化好,更有甚者,本指令碼甚至可以把數字固定在使用者指定的範圍中。 01#!/bin/sh02 03 # validint.sh --正確化整型輸入,包括負的。04 05 function validint06 {07 # 正確化第一個域。08 # 如果使用者提供了$2和$3的話,那麼有: $2 <= 第一個域 <= $309 10 number="$1"; min="$2"; max="$3"11 12 if [ -z $number ]; then13 echo "無輸入。不可接受。" >&214 return 115 fi16 17 if [ "${number%${number#?}}" = "-" ]; then # 看看第一個字元是不是負號18 testvalue="${number#?}" # 是的話就去掉它19 else20 testvalue="$number"21 fi22 23 nodigits="$(echo $testvalue | sed 's/[[:digit:]]//g')"24 25 if [ ! -z $nodigits ]; then26 echo "錯誤的數字格式!只有數字,不能有逗號、空格等" >&227 return 128 fi29 30 if [ ! -z $min ]; then31 if [ "$number" -lt "$min" ]; then32 echo "輸入的值太小:輸入的下限是 $min" >&233 return 134 fi35 fi36 37 if [ ! -z $max ]; then38 if [ "$number" -gt "$max" ]; then39 echo "輸入的值太大:輸入的上限是 $max" >&240 return 141 fi42 fi43 return 044 } 運行指令碼: 整個指令碼就是一個函數,完全可以拷貝到別的shell指令碼中去,或者是作為一個庫檔案。為了能夠在命令列執行這個檔案,簡單的增加幾行就行了: if validint "$1" "$2" "$3"; then echo "That input is a valid integer value within your constraints" fi 運行結果: 01./validint.sh 02 無輸入。不可接受。03 ./validint.sh 1234.304 錯誤的數字格式!只有數字,不能有逗號、空格等05 ./validint.sh 103 1 10006 輸入的值太大:輸入的上限是 10007 ./validint.sh -17 0 2508 輸入的值太小:輸入的下限是 009 ./validint.sh -17 -20 2510 That input is a valid integer value within your constraints指令碼分析: 注意該指令碼中判斷第一個字元是不是負號的語句: if [ "${number%${number#?}}" = "-" ]; then 如果第一個字元是負號,那麼就把整數的數值部分賦給testvalue。然後這個非負的值就被去掉其中含有的所有數字,再測試剩下的東西。你可能會嘗試著將指令碼中的2個嵌套if語句用AND串連起來。比如下面的代碼看起來也能運行: if [ ! -z $min -a "$number" -lt "$min" ]; then echo "輸入的值太小:輸入的下限是 $min" >&2 exit 1fi 但事實上它並不能如期運行,因為在一個shell指令碼中,你並不能保證AND語句串連的第二個測試條件一定不會被測試,即使AND前的第一個測試已經證明為False了。