Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15936656
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-03-21 16:49:23

我们经常忽略对格式的要求,在输入资料的过程中,使用不正确的格式或语法。身为一名脚本的开发者,当我们在输入资料时,有必要避开或者纠正这种错误,以防止这些问题的发生。

最常遇到的情况,通常跟档案名称或是资料库的关键字有关。下面是这个脚本的要求:在输入资料前就给出提示,只能有大小写及,不能有标点符号、空白字示或间隔。希望大家能够做到,现在让大家来测试这个脚本吧!


脚本源代码:

#!/bin/sh
# validAlphaNum - 确认使用者输入的资料为字母与数字

validAlphaNum()
{
  # 传回值:0表示使用者输入的资料是大小写的字母或数字,1为其它

  # 移除其它的字元
  compressed="$(echo $1 | sed -e 's/[^[:alnum:]]//g')"

  if [ "$compressed" != "$input" ] ; then
    return 1
  else
    return 0
  fi
}

# 在该脚本里一个函数的简单用法
echo -n "Enter input: "
read input

if ! validAlphaNum "$input" ; then
  echo "Your input must consist of only letters and numbers." >&2
  exit 1
else
  echo "Input is valid."
fi

exit 0


工作原理

这个逻辑思维是直线式的。第一,它将输入的字符串利用sed模式建立出一个新字符串,之后会把新的字符串与原先输入的字符串进行,如果两个字符 串相同,表示符合我们的要求;而如果不一样,则输入的字符串便不符合我们的规定,即只能输入字母与数字。此例子中较特别的是利用sed命令替换掉不在[: alnum:], 设定中的所有字符。说明下,[:alnum:]在此处的POSIX语法中当作所有的大小写字母及数字。里面compressed变量的值如果与先前输入的 值不吻合,程序将会移除字串中所有的英文字母与数字,仅留下不恰当的字串并且传回1。


运行脚本

这个特定的程序是独立运作的。在执行时它会有输入的提示信息,并在输入之后立刻判断输入数据是否正确。这个脚本是一个典型的方程式,也是一个不错的范例。在你想要把它结合成一个较大且复杂的程序前,我们先来作下测试。


结果

$ validalnum
Enter input: valid123SAMPLE
Input is valid.
$ validalnum
Enter input: this is most assuredly NOT valid, 12345
Your input must consist of only letters and numbers.


改进与加强

这个"移除要的字元,之后看看剩下什么"的方式非常好用,因为它具有很大的弹性。如果想留下大写字母,而且也要留下空格、逗号、句号的话,你可以这么做:

sed 's/[^[:upper:] ,.]//g'

想要测试电话号码的输入格式是否正确(包括数字、空格、括号与减号),可以这么做:

sed 's/[^[:digit:]\(\)- ]//g'

想要只能输入数字的话,你可以试着这样做,不过要特别小心:

sed 's/[^[:digit:]]//g'

但是你是否允许输入负数呢? 如果说你将原本的数值都加上了负号,像是 -3-4,在程序中这也算是合法的数值,不过实际上,它並不是一个正确的数值。对于如何处理负号的特定问题,我们在以后将会讨论到。

阅读(1146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~