第一章:The Missing Code Library--5.合法化整型輸入

   相似於你看過的第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
    echo "That input is a valid integer value within your constraints"
fi

運行結果: 測試


./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

相關文章
相關標籤/搜索