Shell编程学习笔记(2)
作者: Badcoffee
Email: blog.oliver@gmail.com
2004年11月
原文出处: http://blog.csdn.net/yayong
版权所有: 转载时请务必以超链接形式标明文章原始出处、作者信息及本声明
用shell实现一个命令或者工具的时候,对命令的参数进行合法性检查是很有必要的。
k shell是UNIX上最适合编程的shell,所以后面的例子都是ksh实现的。
例1:下面的函数实现了检查入口参数是否是大于0的整数:
check_numberic( )
{
temstr=`echo $1|bc 2>/dev/null`
if [ -z "$temstr" ] || [ $1 != $temstr ] || [ $1 -lt 0 ] || echo $temstr | grep "." >/dev/null 2>&1; then
echo "$1 must be an positive interger\n"
exit 1
fi
}
这个函数利用了bc(1)命令对输入参数的返回值进行判断,比较简练。
通过例1,可以掌握ksh的下列语法:
1. 函数的语法:
functionname( )
{
若干命令行
}
调用函数的格式为:
functionname param1 param2……
函数有自己的退出状态,因此函数可以作为if、while等控制结构的条件。
与c语言不同的是,在函数定义时不用带参数说明。
但在调用函数时可带有参数,此时shell将把这些参数分别赋予相应的位置参数$1、$2、...及$*。
2. if条件语句: <>
if 条件命令串; then
条件为真时的命令串
else
条件为假时的命令串
fi
3.test测试命令
详细的test命令的说明,可以man test得到。
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,下面简单说明一下:
(1)数值测试:
-eq:等于则为真
-ne:不等于则为真
-gt:大于则为真
-ge:大于等于则为真
-lt:小于则为真
-le:小于等于则为真
(2)字符串测试:
=:等于则为真
!=:不相等则为真
-z字符串:字符串长度伪则为真
-n字符串:字符串长度不伪则为真
(3)文件测试:
-e文件名:如果文件存在则为真
-r文件名:如果文件存在且可读则为真
-w文件名:如果文件存在且可写则为真
-x文件名:如果文件存在且可执行则为真
-s文件名:如果文件存在且至少有一个字符则为真
-d文件名:如果文件存在且为目录则为真
-f文件名:如果文件存在且为普通文件则为真
-c文件名:如果文件存在且为字符型特殊文件则为真
-b文件名:如果文件存在且为块特殊文件则为真
例2: 下面的函数实现了检查入口参数是否为一个合法的串口波特率
check_baud( )
{
default_baud=`stty -a | grep speed | awk -F" " '{print $2}'`
check_numberic $1
stty $1
if [ $? -ne 0 ]; then
echo "$1 must be a baudrate\n"
exit 1
else
stty $default_baud
fi
}
首先,波特率必须是一个正整数,例2利用了例1的函数check_numberic做了检查。
然后,利用stty对输入参数是否为一个波特率值进行判断。
比起先利用数组预置所有可能的波特率,再进行比较判断的方法,这种方法简洁了许多。
例2用到了shell的预定义变量 $?。
4. 预定义变量
预定义变量和环境变量相类似,是在shell一开始时就定义了的变量。
不同的是,用户只能使用这些变量而不能重定义。所有预定义变量都是由$符和另一个符号组成的:
$#:位置参数的数量
$*:所有位置参数的内容
$?:命令执行后返回的状态
$$:当前进程的进程号
$!:后台运行的最后一个进程号
$0:当前执行的进程名
其中,“$?”用于检查上一个命令执行是否正确(在Unix/Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
“$$”变量最常见的用途是用作临时文件的名字以保证临时文件不会重复。