相似於你看過的第2個腳本,正確化整型輸入看起來很是簡單,除非你想要確保負數也能做爲輸入。問題就在於每個數值只能有一個負號,且必須出如今數字的頭部。本腳本中的糾正程序能保證負數也能被正確的格式化好,更有甚者,本腳本甚至能夠把數字固定在用戶指定的範圍中。 git
#!/bin/sh # validint.sh --正確化整型輸入,包括負的。 function validint { # 正確化第一個域。 # 若是用戶提供了$2和$3的話,那麼有: $2 <= 第一個域 <= $3 number="$1"; min="$2"; max="$3" if [ -z $number ]; then echo "無輸入。不可接受。" >&2 return 1 fi if [ "${number%${number#?}}" = "-" ]; then # 看看第一個字符是否是負號 testvalue="${number#?}" # 是的話就去掉它 else testvalue="$number" fi nodigits="$(echo $testvalue | sed 's/[[:digit:]]//g')" if [ ! -z $nodigits ]; then echo "錯誤的數字格式!只有數字,不能有逗號、空格等" >&2 return 1 fi if [ ! -z $min ]; then if [ "$number" -lt "$min" ]; then echo "輸入的值過小:輸入的下限是 $min" >&2 return 1 fi fi if [ ! -z $max ]; then if [ "$number" -gt "$max" ]; then echo "輸入的值太大:輸入的上限是 $max" >&2 return 1 fi fi return 0 }
運行腳本: shell
整個腳本就是一個函數,徹底能夠拷貝到別的shell腳本中去,或者是做爲一個庫文件。爲了可以在命令行執行這個文件,簡單的增長几行就好了: 函數
if validint "$1" "$2" "$3"; then運行結果: 測試
./validint.sh 無輸入。不可接受。 ./validint.sh 1234.3 錯誤的數字格式!只有數字,不能有逗號、空格等 ./validint.sh 103 1 100 輸入的值太大:輸入的上限是 100 ./validint.sh -17 0 25 輸入的值過小:輸入的下限是 0 ./validint.sh -17 -20 25 That input is a valid integer value within your constraints
腳本分析:
注意該腳本中判斷第一個字符是否是負號的語句: spa
if [ "${number%${number#?}}" = "-" ]; then
若是第一個字符是負號,那麼就把整數的數值部分賦給testvalue。而後這個非負的值就被去掉其中含有的全部數字,再測試剩下的東西。你可能會嘗試着將腳本中的2個嵌套if語句用AND鏈接起來。好比下面的代碼看起來也能運行: 命令行
if [ ! -z $min -a "$number" -lt "$min" ]; then
echo "輸入的值過小:輸入的下限是 $min" >&2
exit 1
fi
但事實上它並不能如期運行,由於在一個shell腳本中,你並不能保證AND語句鏈接的第二個測試條件必定不會被測試,即便AND前的第一個測試已經證實爲False了。(注:shell的不肯定性,具體的原理,老七尚未探索清楚。有懂的朋友不妨給老七解答下。^_^) code