linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > unix > unix提高 >
栏目导栏
资料搜索
热门文章
·20%的SOLARIS知识解决80%的问题
·Solaris启动过程详解 zt
·查看Solaris系统硬件配置的命令
·Unix系列shell程序编写(中)
·STRUTS 源码学习笔记
·SOLARIS技巧篇
·snort源码分析
·Unix系列shell程序编写(下)
·在solaris 10/x86下安装oracle
·solaris 10 硬盘安装
·Solaris安全配置手册
·Apache源代码分析——关于模块
·HP-UX基本指令快速参考
· Tomcat Server源码启动分析
·Solaris8 双网卡配置(路由器用
最新文章
·solaris系统安全配置
·RHEL5.0操作系统下NFS服务的配
·Solaris Linux 9下Vsftpd的配置
·在HP-UX下建立只归属于某个目录
·SolarWinds2002使用说明
·从外部存储划盘并加入vg,为fs扩
·因带库问题导致系统光纤卡报错
·Unix下多线程中条件变量的使用
·UNIX和Linux中信号的个数
·不同的类UNIX操作系统密码破解
·AIX系统下Domino邮件服务器安装
·限制ROOT用户远程登陆UNIX系统
·Unix操作系统入侵追踪反击战
·AIX CDE不能启动的故障一般性解
·CentOS4.4用VSFTPD架设FTP服务
Google
 
Unix系列shell程序编写(中)
[ 作者: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联盟
QUOTE:
#--交互式备份,恢复程序 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论坛讨论
分页:1 [2] 3
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Unix系列shell程序编写(上)  (2006-06-24 15:06:12)