|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
[ 作者: Linux联盟收集 加入时间:2006-06-24 15:08:01 来自:Linux联盟收集
] | |
|
fi TmkLinux联盟 TmkLinux联盟 3>test命令进行条件测试 TmkLinux联盟 TmkLinux联盟 if语句可以通过测试命令执行的返回状态来控制命令的执行,若要测试其他条件,在bsh中可以使用test命令。该命令检测某一条件,当条件为真时返回0,否则返回非0值。test命令可以使Shell程序中的if语句象其他程序语言中的条件判断语句一样,具有很强的功能。 TmkLinux联盟 TmkLinux联盟 test命令的使用方法为: TmkLinux联盟 test condition TmkLinux联盟 可测试的条件分为4类: TmkLinux联盟 1)测试两个字符串之间的关系。 TmkLinux联盟 2)测试两个整数之间关系。 TmkLinux联盟 3)测试文件是否存在或是否具有某种状态或属性。 TmkLinux联盟 4)测试多个条件的与(and)或(or)组合。 TmkLinux联盟 TmkLinux联盟 1、条件语句>>test语句 TmkLinux联盟 TmkLinux联盟 1>测试字符串间的关系 TmkLinux联盟 TmkLinux联盟 bsh把所有的命令行和变量都看作字符串。一些命令如expr和test可以把字符当作数字进行操作。 TmkLinux联盟 TmkLinux联盟 同样任何数字也可以作为字符串进行操作。 TmkLinux联盟 TmkLinux联盟 用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下: TmkLinux联盟 str1 = str2 当两个串有相同内容、长度时为真 TmkLinux联盟 str1 != str2 当串str1和str2不等时为真 TmkLinux联盟 -n str1 当串的长度大于0时为真(串非空) TmkLinux联盟 -z str1 当串的长度为0时为真(空串) TmkLinux联盟 str1 当串str1为非空时为真 TmkLinux联盟 TmkLinux联盟 不但Shell程序可以使用test进行条件判断,test命令也可以独立执行,如: TmkLinux联盟 TmkLinux联盟 $str1=abcd TmkLinux联盟 $test $str1 = abcd TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:0 TmkLinux联盟 TmkLinux联盟 与上例中第一行赋值语句中的等号不同,test命令中的等号两边必须要有空格。本例test命令共有3个参数。注意两个串相等必须是长度和内容都相等。 TmkLinux联盟 TmkLinux联盟 $str1="abcd " TmkLinux联盟 $test "$str1" = abcd TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:1 TmkLinux联盟 TmkLinux联盟 上面str1包含5个字符,其中最后一个为空格符。而test命令中的另一个串只有4个字符,所以两串不等,test返回1。 TmkLinux联盟 TmkLinux联盟 不带任何操作符和使用-n操作符测试一个串结果是一样的,例如: TmkLinux联盟 TmkLinux联盟 $str1=abce TmkLinux联盟 $test $str1 TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:0 TmkLinux联盟 $test -n $str1 TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:0 TmkLinux联盟 TmkLinux联盟 但是,上面两条命令也有一点差别,反映出了使用test命令潜在的问题,请看下例: TmkLinux联盟 TmkLinux联盟 $str1=" " TmkLinux联盟 $test $str1 TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:1 TmkLinux联盟 $test -n "$str1" TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:0 TmkLinux联盟 $test -n $str1 TmkLinux联盟 结果显示:test:argument expected TmkLinux联盟 TmkLinux联盟 上例中,第一次测试为假因为Shell在执行命令行之前首先要进行变量替换,即把$str1换成空格,然后shell又将命令行上的空格删除,故test命令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test测试到的是一个包含空格的串,在第三次测试中,shell把空格删除,只把-n传个test命令,所以显示参数错。 TmkLinux联盟 TmkLinux联盟 2>测试两个整数之间关系 TmkLinux联盟 TmkLinux联盟 test命令与expr命令一样,也可以把字符转变成整数,然后对其操作。test命令对两个数进行比较,使用的操作符如下: TmkLinux联盟 TmkLinux联盟 int1 -eq int2 两数相等为真 TmkLinux联盟 int1 -ne int2 两数不等为真 TmkLinux联盟 int1 -gt int2 int1大于int2为真 TmkLinux联盟 int1 -ge int2 int1大于等于int2为真 TmkLinux联盟 int1 -lt int2 int1小于int2为真 TmkLinux联盟 int1 -le int2 int1小于等于int2为真 TmkLinux联盟 TmkLinux联盟 下面的例子反映了字符串比较与数字比较的不同: TmkLinux联盟 TmkLinux联盟 $str1=1234 TmkLinux联盟 $str2=01234 TmkLinux联盟 $test $str1 = $str2 TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:1 TmkLinux联盟 $test $str1 -eq $str2 TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:0 TmkLinux联盟 TmkLinux联盟 3>有关文件的测试 TmkLinux联盟 TmkLinux联盟 使用test进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真。 TmkLinux联盟 TmkLinux联盟 -r file 用户可读为真 TmkLinux联盟 -w file 用户可写为真 TmkLinux联盟 -x file 用户可执行为真 TmkLinux联盟 -f file 文件为正规文件为真 TmkLinux联盟 -d file 文件为目录为真 TmkLinux联盟 -c file 文件为字符特殊文件为真 TmkLinux联盟 -b file 文件为块特殊文件为真 TmkLinux联盟 -s file 文件大小非0时为真 TmkLinux联盟 -t file 当文件描述符(默认为1)指定的设备为终端时为真 TmkLinux联盟 4>复杂的条件测试(and 、or 、not) TmkLinux联盟 -a 与 TmkLinux联盟 -o 或 TmkLinux联盟 ! 非 TmkLinux联盟 就是组合条件了,任何高级语言中都有的(NOT 、AND 、OR),例如: TmkLinux联盟 $test -r em.null -a -s em.null TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:1 TmkLinux联盟 说明了em.null并不是可读并且非空的文件 TmkLinux联盟 TmkLinux联盟 5>另一种执行test的方法 TmkLinux联盟 TmkLinux联盟 bsh中还有另一种执行test命令的方法,就是把测试条件放到一对[ ]中,例如: TmkLinux联盟 $int1=4 TmkLinux联盟 $[ $int1 -gt 2 ] TmkLinux联盟 $echo $? TmkLinux联盟 结果显示:0 TmkLinux联盟 TmkLinux联盟 要注意在[ 的后面和 ]符号的前面要有一个空格。 TmkLinux联盟 下面我们用test命令写个简单但比较完善的程序: TmkLinux联盟 TmkLinux联盟 #-- 备份程序 TmkLinux联盟 TmkLinux联盟 #-- 检查参数 TmkLinux联盟 if [ $# -ne 1 ] TmkLinux联盟 then TmkLinux联盟 TmkLinux联盟 echo "请在程序名后面指出要备份文件所在目录!" TmkLinux联盟 exit 1 TmkLinux联盟 fi TmkLinux联盟 #-- 检查目录名是否有效 TmkLinux联盟 if [ !-d "$1" ] TmkLinux联盟 then TmkLinux联盟 echo "$1 不是一个目录!" TmkLinux联盟 exit 2 TmkLinux联盟 fi TmkLinux联盟 cd $1 TmkLinux联盟 ls -a | cpio -o >/dev/mnt0 TmkLinux联盟 if [ $? -eq 0 ] TmkLinux联盟 then TmkLinux联盟 rm * TmkLinux联盟 else TmkLinux联盟 echo "cpio执行不成功!备份失败..." TmkLinux联盟 exit 3 TmkLinux联盟 fi TmkLinux联盟 TmkLinux联盟 6>空命令 TmkLinux联盟 TmkLinux联盟 在Bsh中用 : 代表空命令,就是充个数,什么都不做 TmkLinux联盟 TmkLinux联盟 7>嵌套if语句和elif结构 TmkLinux联盟 TmkLinux联盟 检查条件1 TmkLinux联盟 A:当条件1为真,则执行一部分操作 TmkLinux联盟 B:若条件1为假,检查条件2 TmkLinux联盟 1)若条件2为真,执行另外一部分操作 TmkLinux联盟 2)若条件2为假,检查条件3 TmkLinux联盟 3)若条件3为真,执行其他一部分操作 TmkLinux联盟 语法如下: TmkLinux联盟 if command TmkLinux联盟 then TmkLinux联盟 command TmkLinux联盟 else TmkLinux联盟 if command TmkLinux联盟 then TmkLinux联盟 command TmkLinux联盟 else TmkLinux联盟 if command TmkLinux联盟 then TmkLinux联盟 command TmkLinux联盟 fi TmkLinux联盟 fi TmkLinux联盟 fi TmkLinux联盟 TmkLinux联盟 8>elif语句 TmkLinux联盟 TmkLinux联盟 嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为: TmkLinux联盟 TmkLinux联盟 if command TmkLinux联盟 then TmkLinux联盟 command TmkLinux联盟 elif command TmkLinux联盟 then TmkLinux联盟 command TmkLinux联盟 elif command TmkLinux联盟 then TmkLinux联盟 command TmkLinux联盟 fi TmkLinux联盟 TmkLinux联盟 上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。 TmkLinux联盟 TmkLinux联盟 9>case语句 TmkLinux联盟 TmkLinux联盟 前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。 TmkLinux联盟 TmkLinux联盟 case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。 TmkLinux联盟 TmkLinux联盟 case value in TmkLinux联盟 pattem 1) TmkLinux联盟 command TmkLinux联盟 command;; TmkLinux联盟 pattem 2) TmkLinux联盟 command TmkLinux联盟 command;; TmkLinux联盟 .... TmkLinux联盟 pattem) TmkLinux联盟 command; TmkLinux联盟 esac TmkLinux联盟 TmkLinux联盟 case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。";;"表示该模式对应的命令部分程序。 TmkLinux联盟 TmkLinux联盟 通过学习下面的read语句,我们们再举例子说明case语句的用法。 TmkLinux联盟 TmkLinux联盟 10>read语句 TmkLinux联盟 TmkLinux联盟 Shell程序不但可以通过命令行参数得到输入数据,还可以使用read命令提示用户输入数据,其语法格式为: TmkLinux联盟 TmkLinux联盟 read var1 var2... ...varn TmkLinux联盟 TmkLinux联盟 当Bsh遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数,Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分隔的一个字母和数字组成的字符串。 TmkLinux联盟 TmkLinux联盟 $read var1 var2 var3 TmkLinux联盟 输入:Hello my friend TmkLinux联盟 TmkLinux联盟 $echo $var1 $var2 $var3 TmkLinux联盟 结果显示:Hello my friend TmkLinux联盟 $echo $var2 TmkLinux联盟 结果显示:my TmkLinux联盟 TmkLinux联盟 下面用个read和case的例子结束本部分的学习: TmkLinux联盟 TmkLinux联盟 TmkLinux联盟
#--交互式备份,恢复程序 TmkLinux联盟 echo "输入要备份文件所在目录:c" TmkLinux联盟 read WORKDIR TmkLinux联盟 if [ !-d $WORKDIR ] TmkLinux联盟 then TmkLinux联盟 echo "Sorry,$WORKDIR is not a directory" TmkLinux联盟 exit 1 TmkLinux联盟 fi TmkLinux联盟 cd $WORKDIR TmkLinux联盟 echo "输入选择:" TmkLinux联盟 echo _ TmkLinux联盟 echo "1.恢复到 $WORKDIR" TmkLinux联盟 echo "2.备份 $WORKDIR" TmkLinux联盟 echo "0.退出" TmkLinux联盟 echo TmkLinux联盟 echo "c" TmkLinux联盟 read CHOICE TmkLinux联盟 case "$CHOICE" in TmkLinux联盟 1)echo "恢复中... ..." TmkLinux联盟 cpio -i < /dev/mnt0;; TmkLinux联盟 2)echo "备份中... ..." TmkLinux联盟 ls | cpio -o > /dev/mnt0;; TmkLinux联盟 0)exit 1 TmkLinux联盟 *)exit 1 TmkLinux联盟 esac TmkLinux联盟 if [ $? -ne 0 ] TmkLinux联盟 then TmkLinux联盟 echo "程序运行中出现错误!" TmkLinux联盟 else TmkLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|
|
|
| |
|
© CopyRight
2006-2009 xxlinux.com.Inc All Rights Reserved |
Powered
by xxlinux.com |
|
|
|