第一章: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

相关文章
相关标签/搜索