合法化整型输入脚本


合法化整型输入脚本
 
正确化整型输入看起来非常简单,除非你想要确保负数也能作为输入。问题就在于每一个数值只能有一个负号,且必须出现在数字的头部。本脚本中的纠正程序能保证负数也能被正确的格式化好,更有甚者,本脚本甚至可以把数字固定在用户指定的范围中。
 
01
#!/bin/sh
02
  
03
 # validint.sh --正确化整型输入,包括负的。
04
  
05
 function validint
06
 {
07
     # 正确化第一个域。
08
     # 如果用户提供了$2和$3的话,那么有: $2 <= 第一个域 <= $3
09
  
10
     number="$1"; min="$2"; max="$3"
11
  
12
     if [ -z $number ]; then
13
         echo "无输入。不可接受。" >&2
14
         return 1
15
     fi
16
  
17
     if [ "${number%${number#?}}" = "-" ]; then     # 看看第一个字符是不是负号
18
         testvalue="${number#?}"                    # 是的话就去掉它
19
     else
20
         testvalue="$number"
21
     fi
22
  
23
     nodigits="$(echo $testvalue | sed 's/[[:digit:]]//g')"
24
  
25
     if [ ! -z $nodigits ]; then
26
         echo "错误的数字格式!只有数字,不能有逗号、空格等" >&2
27
         return 1
28
     fi
29
  
30
     if [ ! -z $min ]; then
31
         if [ "$number" -lt "$min" ]; then
32
             echo "输入的值太小:输入的下限是 $min" >&2
33
             return 1
34
         fi
35
     fi
36
  
37
     if [ ! -z $max ]; then
38
         if [ "$number" -gt "$max" ]; then
39
             echo "输入的值太大:输入的上限是 $max" >&2
40
             return 1
41
         fi
42
     fi
43
     return 0
44
 }
 运行脚本:
 
   整个脚本就是一个函数,完全可以拷贝到别的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.3
04
 错误的数字格式!只有数字,不能有逗号、空格等
05
 ./validint.sh 103 1 100
06
 输入的值太大:输入的上限是 100
07
 ./validint.sh -17 0 25
08
 输入的值太小:输入的下限是 0
09
 ./validint.sh -17 -20 25
10
 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 1
fi
   但事实上它并不能如期运行,因为在一个shell脚本中,你并不能保证AND语句连接的第二个测试条件一定不会被测试,即使AND前的第一个测试已经证明为False了。

相关内容

    暂无相关文章