Unix系列shell程序编写4

本文介绍了 Bsh 编程的基础知识,包括条件测试、空命令、嵌套 if 语句、elif 和 case 语句的使用方法,以及 while 循环的应用。通过具体实例展示了如何构建复杂的条件判断和循环结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4>复杂的条件测试(and 、or 、not)
  -a         与
  -o        或
  !        非
  就是组合条件了,任何高级语言中都有的(NOT 、AND 、OR),例如:
    $test -r em.null -a -s em.null
    $echo $?
    结果显示:1
    说明了em.null并不是可读并且非空的文件
5>另一种执行test的方法
  bsh中还有另一种执行test命令的方法,就是把测试条件放到一对[ ]中,例如:
    $int1=4
    $[ $int1 -gt 2 ]
    $echo $?
    结果显示:0
要注意在[ 的后面和 ]符号的前面要有一个空格。
  下面我们用test命令写个简单但比较完善的程序:
    #-- 备份程序
  
    #-- 检查参数
    if [ $# -ne 1 ]
    then
      echo "请在程序名后面指出要备份文件所在目录!"
      exit 1
    fi
    #-- 检查目录名是否有效
    if [ !-d "$1" ]
    then
      echo "$1 不是一个目录!"
      exit 2
    fi
    cd $1
    ls -a | cpio -o >/dev/mnt0
    if [ $? -eq 0 ]
    then
      rm *
    else
      echo "cpio执行不成功!备份失败..."
      exit 3
    fi
6>空命令
  在Bsh中用 : 代表空命令,就是充个数,什么都不做
7>嵌套if语句和elif结构
  检查条件1
  A:当条件1为真,则执行一部分操作
  B:若条件1为假,检查条件2
    1)若条件2为真,执行另外一部分操作
    2)若条件2为假,检查条件3
    3)若条件3为真,执行其他一部分操作
  语法如下:
    if command
    then
      command
    else
      if command
      then
        command
      else
        if command
        then
          command
        fi
      fi
    fi
8>elif语句
  嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为:
    if command
    then
      command
    elif command
    then
      command
    elif command
    then
      command
    fi
  上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。
9>case语句
  前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。
  case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。
  case value in
   pattem 1)
    command
    command;;
   pattem 2)
    command
    command;;
   ....
   pattem)
    command;
  esac
  case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。";;"表示该模式对应的命令部分程序。
  通过学习下面的read语句,我们们再举例子说明case语句的用法。
10>read语句
  Shell程序不但可以通过命令行参数得到输入数据,还可以使用read命令提示用户输入数据,其语法格式为:
  read var1 var2... ...varn
当Bsh遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数,Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分隔的一个字母和数字组成的字符串。
  $read var1 var2 var3
    输入:Hello my friend
  
  $echo $var1 $var2 $var3
    结果显示:Hello my friend
  $echo $var2
    结果显示:my
下面用个read和case的例子结束本部分的学习:
  #--交互式备份,恢复程序
  echo "输入要备份文件所在目录:\c"
  read WORKDIR
  if [ !-d $WORKDIR ]
  then
    echo "Sorry,$WORKDIR is not a directory"
    exit 1
  fi
  cd $WORKDIR
  echo "输入选择:"
  echo _
  echo "1.恢复到 $WORKDIR"
  echo "2.备份 $WORKDIR"
  echo "0.退出"
  echo
  echo "\c"
  read CHOICE
  case "$CHOICE" in
   1)echo "恢复中... ..."
    cpio -i < /dev/mnt0;;
   2)echo "备份中... ..."
    ls | cpio -o > /dev/mnt0;;
   0)exit 1
   *)exit 1
  esac
  if [ $? -ne 0 ]
  then
   echo "程序运行中出现错误!"
  else
   echo "操作成功!"
  fi  
 
  在上面代码中,"*"定义了其他模式下不匹配时的默认操作。

循环语句
  前面介绍的程序和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理UNIX的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX的Shell也提供了强大的循环处理语句。
  Bsh语言中有三种循环语句-while循环、until循环、for循环,下面通过具体的例子分别介绍这三种结构。
  While循环
  在while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下:
while command
do
  command
  command
  … …
done
示例代码如下:
#测试while循环小程序
x_t=1
  while [$x_t -lt 5 ]
  do
     mm=` expr $x_t \* $int `  #注意"\"的作用
     echo "$mm"
     x_t=` expr $x_t + 1 `   #注意expr的用法
  done
  echo "THE WHILE IS END!\n"
程序的执行结果如下:
1
4
9
16
THE WHILE IS END
  在上述程序中,当变量x_t的值小于5的时候,执行while循环中的语句。在第五次循环时, [ $x_t-lt5]命令返回非零值,于是程序执行done后面的代码。
现在利用while循环,可以改进我们早些时候用的备份数据的例子,当用户指定的目录备份完毕后,使用while循环使程序执行一次可以备份多个用户指定的目录。代码如下:
echo "欢迎使用备份小程序"
  ANS=Y
  while [ $ANS = Y -o $ANS = y ]
  do
    echo _
    #读目录名
    echo "输入要备份的目录名:\c"
    read DIR
    if [ ! -d $DIR ]
    then
        echo "$DIR不是一个目录!"
        exit 1
    fi
    cd $DIR
    echo "请选择:"
    echo _
    echo "1 恢复数据到 $DIR"
    echo "2 备份$DIR的数据"
    echo
    echo "请选择:\c"
    read CHOICE
    case "$CHOICE" in
       1) echo "恢复中… …"
        cpio -i        2) echo "备份中… …"
        cpio -o >/dev/rmt0;;
       *) echo "选择无效"
    esac
    if [ $? -ne 0 ]
    then
       echo "cpio执行过程中出现问题"
       exit 2
    fi
    echo "继续别的目录吗?(Y/y)\c"
    read ANS
  done
  在程序开始,我们给变量ANS符值为Y,根据whlie的判断条件,程序进入while循环,执行do-done中的语句,每次循环都要求用户输入ANS的值用来判断是否进行下次重复执行do-done中的语句。如果用户输入的条件不满足while语句条件,循环结束,程序执行done后面的语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值