文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Unix系列shell程序编写(中4)

Unix系列shell程序编写(中4)

时间:2006-01-04  来源:tony_413

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! "

程序的执行结果如下:
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后面的语句。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载