第一章:The Missing Code Library--5.合法化整型输入
2012-12-04 16:20
302 查看
类似于你看过的第2个脚本,正确化整型输入看起来非常简单,除非你想要确保负数也能作为输入。问题就在于每一个数值只能有一个负号,且必须出现在数字的头部。本脚本中的纠正程序能保证负数也能被正确的格式化好,更有甚者,本脚本甚至可以把数字固定在用户指定的范围中。
代码:
validint.sh
运行脚本:
整个脚本就是一个函数,完全可以拷贝到别的shell脚本中去,或者是作为一个库文件。为了能够在命令行执行这个文件,简单的增加几行就行了:
运行结果:
脚本分析:
注意该脚本中判断第一个字符是不是负号的语句:
如果第一个字符是负号,那么就把整数的数值部分赋给testvalue。然后这个非负的值就被去掉其中含有的所有数字,再测试剩下的东西。你可能会尝试着将脚本中的2个嵌套if语句用AND连接起来。比如下面的代码看起来也能运行:
但事实上它并不能如期运行,因为在一个shell脚本中,你并不能保证AND语句连接的第二个测试条件一定不会被测试,即使AND前的第一个测试已经证明为False了。(注:shell的不确定性,具体的原理,老七还没有探索清楚。有懂的朋友不妨给老七解答下。^_^)
代码:
validint.sh
#!/bin/sh # validint.sh --正确化整型输入,包括负的。 function validint { # 正确化第一个域。 # 如果用户提供了$2和$3的话,那么有: $ <= 第一个域 <= $ number="$1"; min="$2"; max="$3" if [ -z $number ]; then echo "无输入。不可接受。" >& return fi if [ "${number%${number#?}}" = "-" ]; then # 看看第一个字符是不是负号 testvalue="${number#?}" # 是的话就去掉它 else testvalue="$number" fi nodigits="$(echo $testvalue | sed 's/[[:digit:]]//g')" if [ ! -z $nodigits ]; then echo "错误的数字格式!只有数字,不能有逗号、空格等" >& return fi if [ ! -z $min ]; then if [ "$number" -lt "$min" ]; then echo "输入的值太小:输入的下限是 $min" >& return fi fi if [ ! -z $max ]; then if [ "$number" -gt "$max" ]; then echo "输入的值太大:输入的上限是 $max" >& return fi fi return }
运行脚本:
整个脚本就是一个函数,完全可以拷贝到别的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 输入的值太大:输入的上限是 ./validint.sh - 输入的值太小:输入的下限是 ./validint.sh - - 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" >& exit fi
但事实上它并不能如期运行,因为在一个shell脚本中,你并不能保证AND语句连接的第二个测试条件一定不会被测试,即使AND前的第一个测试已经证明为False了。(注:shell的不确定性,具体的原理,老七还没有探索清楚。有懂的朋友不妨给老七解答下。^_^)
相关文章推荐
- 第一章:The Missing Code Library--5.合法化整型输入
- 第一章:The Missing Code Library--6.合法化浮点数输入
- 第一章:The Missing Code Library--2.合法化输入
- 第一章:The Missing Code Library--2.合法化输入
- 第一章:The Missing Code Library--6.合法化浮点数输入
- 第一章:The Missing Code Library--7.合法化日期格式
- 第一章:The Missing Code Library--7.合法化日期格式
- 第一章:The Missing Code Library--11.ANSI颜色序列
- 第一章:The Missing Code Library--13.调试Shell脚本
- 第一章:The Missing Code Library--8.避免不合要求的echo方法
- 第一章:The Missing Code Library--9.一个任意精度浮点计算器
- 第一章:The Missing Code Library--8.避免不合要求的echo方法
- 第一章:The Missing Code Library--4.优雅的表示大数
- 第一章:The Missing Code Library--9.一个任意精度浮点计算器
- 第一章:The Missing Code Library--3.正常化日期格式
- 第一章:The Missing Code Library--1.在系统路径PATH中寻找程序
- 第一章:The Missing Code Library--10.锁定文件
- 第一章:The Missing Code Library--3.正常化日期格式
- 第一章:The Missing Code Library--4.优雅的表示大数
- 第一章:The Missing Code Library--12.建立一个Shell脚本库