文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[转载]Bourne Shell及shell编程 四

[转载]Bourne Shell及shell编程 四

时间:2005-11-26  来源:ghostzhu



版权声明:
本文内容为大连理工大学LINUX选修课讲义,欢迎大家转载,但禁止使用本材料进行
任何商业性或赢利性活动。转载时请保留本版权声明。

作者:何斌武,[email protected],大连理工大学网络中心,April 1999.

[请点击阅读全文]

                 ——by ghostzhu

<4>. for循环
       格式:
                for var in arg1 arg2 ... argn
                do
                        command
                        ....
                        command
                done
 
        示例:
        $ for letter in a b c d e; do echo $letter;done
        a
        b
        c
        d
        e
 
        对当前目录下的所有文件操作:
        $ for i in *
          do
                if [ -f $i ]
                then
                        echo "$i is a file"
                elif    [ -d $i ]
                        echo "$i is a directory"
                fi
          done
 
        求命令行上所有整数之和:
        #!/bin/sh
 
        sum=0
 
        for INT in $*
        do
                sum=`expr $sum + $INT`
        done
 
        echo $sum
 
 
      <6> 从循环中退出: break和continue命令
        break           立即退出循环
        continue        忽略本循环中的其他命令,继续下一下循环
 
        在shell编程中有时我们要用到进行无限循环的技巧,也就是说这种循环一直执行


        到break或continue命令。这种无限循环通常是使用true或false命令开始的。UN
IX
        系统中的true总是返加0值,而false则返回非零值。如下所示:
 
        #一直执行到程序执行了break或用户强行中断时才结束循环
        while true
        do
                command
                ....
                command
        done
 
        上面所示的循环也可以使用until false, 如下:
 
        until false
        do
                command
                ....
                command
        done
 
        在如下shell script中同时使用了continue,break以及case语句中的正规表达式

法:
 
         #!/bin/sh
         # Interactive program to restore, backup, or unload
         # a directory
 
         echo "Welcome to the menu driven Archive program"
 
         while true
         do
         # Display a Menu
            echo
            echo "Make a Choice from the Menu below"
            echo _
            echo "1  Restore Archive"
            echo "2  Backup directory"
            echo "3  Unload directory"
            echo "4  Quit"
            echo
 
         # Read the user s selection
            echo -n "Enter Choice: "
 
            read CHOICE
 
            case $CHOICE in
               [1-3] ) echo
                       # Read and validate the name of the directory
 
                       echo -n "What directory do you want? "
                       read WORKDIR
 
                       if [ ! -d "$WORKDIR" ]
                       then
                          echo "Sorry, $WORKDIR is not a directory"
                          continue
                       fi
 
                       # Make the directory the current working directory
                       cd $WORKDIR;;
 
                    4) :;;    # :为空语句,不执行任何动作
                    *) echo "Sorry, $CHOICE is not a valid choice"
                       continue
            esac
 
            case "$CHOICE" in
               1) echo "Restoring..."
                  cpio -i </dev>/dev/rmt/0h;;
 
               3) echo "Unloading..."
                  ls | cpio -o >/dev/rmt/0h;;
 
               4) echo "Quitting"
                  break;;
            esac
 
         #Check for cpio errors
 
            if [ $? -ne 0 ]
            then
               echo "A problem has occurred during the process"
               if [ $CHOICE = 3 ]
               then
                  echo "The directory will not be erased"
               fi
 
               echo "Please check the device and try again"
               continue
            else
               if [ $CHOICE = 3 ]
               then
                  rm *
               fi
            fi
         done
 
 
(6)结构化编程:定义函数
   同其他高级语言一样,shell也提供了函数功能。函数通常也称之为子过程(subroutin
e)
,
   其定义格式如下:
 
   funcname()
   {
        command
        ...
        command;  #分号
   }
 
   定义函数之后,可以在shell中对此函数进行调用,使用函数定义可以将一个复杂的程


   为多个可管理的程序段,如下所示:
 
        # start program
 
         setup ()
         {  command list ; }
 
         do_data ()
         {  command list ; }
 
         cleanup ()
         {  command list ; }
 
         errors ()
         {  command list ; }
 
         setup
         do_data
         cleanup
         # end program
 
     技巧:
        . 在对函数命名时最好能使用有含义的名字,即函数名能够比较准确的描述函数

完成
          的任务。
        . 为了程序的维护方便,请尽可能使用注释
 
 
     使用函数的另一个好处就是可以在一个程序中的不同地方执行相同的命令序列(函数
),
     如下所示:
 
     iscontinue()
     {
        while true
        do
                echo -n "Continue?(Y/N)"
                read ANSWER
 
                case $ANSWER in
                        [Yy])   return 0;;
                        [Nn])   return 1;;
                        *) echo "Answer Y or N";;
                esac
        done
     }
 
     这样可以在shell编程中调用iscontinue确定是否继续执行:
 
     if iscontinue
     then
        continue
     else
        break
     fi
 
 
  ** shell函数与shell程序非常相似,但二者有一个非常重要的差别:shell程序是由子
sh
ell
     执行的,而shell函数则是作为当前shell的一部分被执行的,因此在当前shell中可


     变函数的定义。此外在任意shell(包括交互式的shell)中均可定义函数,如:
 
     $ dir
     dir: not found
     $ dir () { ls -l ;}
     $ dir
     total 5875
     -rw-r--r--   1 hbwork        100 Nov 10 23:16 doc
     -rw-r--r--   1 hbwork    2973806 Nov 10 23:47 ns40docs.zip
     -rw-r--r--   1 hbwork    1715011 Nov 10 23:30 ns840usr.pdf
     -rw-r--r--   1 hbwork    1273409 Sep 23  1998 radsol21b6.tar.Z
     -rw-r--r--   1 hbwork       7526 Nov 10 23:47 wget-log
     -rw-r--r--   1 hbwork       1748 Nov 13 21:51 wget-log.1
     $ unset dir
     $ dir () {
     > echo "Permission  Link Owner Group  File_SZ   LastAccess FileName"
     > echo "-----------------------------------------------------------"
     > ls -l $*;
     > }
 
        $ dir
        Permission  Link Owner Group  File_SZ   LastAccess FileName
        -----------------------------------------------------------
        total 5875
        -rw-r--r--   1 hbwork        100 Nov 10 23:16 doc
        -rw-r--r--   1 hbwork    2973806 Nov 10 23:47 ns40docs.zip
        -rw-r--r--   1 hbwork    1715011 Nov 10 23:30 ns840usr.pdf
        -rw-r--r--   1 hbwork    1273409 Sep 23  1998 radsol21b6.tar.Z
        -rw-r--r--   1 hbwork       7526 Nov 10 23:47 wget-log
        -rw-r--r--   1 hbwork       1748 Nov 13 21:51 wget-log.1
 
     通常情况下,shell script是在子shell中执行的,困此在此子shell中对变量所作的

     修改对父shell不起作用。点(.) 命令使用shell在不创建子shell而由当前shell读取

     并执行一个shell script, 可以通过这种方式来定义函数及变量。此外点(.)命令最

     常用的功能就是通过读取.profile来重新配置初始化login变量。如下所示:
 
     $ . .profile
     (csh相对于.命令的是source命令).
 
(7)使用And/Or结构进行有条件的命令执行
<1> And , 仅当第一个命令成功时才有执行后一个命令,如同在逻辑与表达式中如果前面

     结果为真时才有必要继续运算,否则结果肯定为假。
 
     格式如下:
 
     command1 && command2
 
     例:rm $TEMPDIR/* && echo "File successfully removed"
 
         等价于
 
         if rm $TEMPDIR/*
         then
                echo "File successfully removed"
         fi
 
<2>Or, 与AND相反,仅当前一个命令执行出错时才执行后一条命令
 
    例: rm $TEMPDIR/* || echo "File not removed"
 
         等价与:
 
         if rm $TEMPDIR/*
         then
                command
         else
                echo "File not removed"
         fi

相关阅读 更多 +
排行榜 更多 +
猎枪行动

猎枪行动

飞行射击 下载
导弹袭击

导弹袭击

飞行射击 下载
猫猫突围封锁要塞新手打法

猫猫突围封锁要塞新手打法

飞行射击 下载