你的位置:首页 > 操作系统

[操作系统]Linux shell脚本编程(三)

Linux shell脚本编程

 

 1 流程控制: 2    循环语句:for,while,until 3  4     while循环: 5  6      while CONDITION; do 7         循环体 8       done 9  10       进入条件:当CONDITION为“真”; 11       退出条件:当CONDITION为“假”; 12  13       while CONDITION; do 14         循环体 15         控制变量的修正表达式 16       done 17  18       示例:求100以内所有正整数之和; 19             #!/bin/bash 20             # 21             declare -i sum=0 22             declare -i i=1 23  24             while [ $i -le 100 ]; do 25                let sum+=$i 26                let i++ 27             done 28  29             echo "Sum: $sum." 30  31     练习:分别求100以内所有奇数之和,及所有偶数之和; 32  33     示例:打印九九乘法表; 34          #!/bin/bash 35          # 36          declare -i i=1 37          declare -i j=1 38  39          while [ $j -le 9 ]; do 40            while [ $i -le $j ]; do 41               echo -e -n "${i}X${j}=$[$i*$j]\t" 42               let i++ 43             done 44             echo 45            let i=1 46            let j++ 47          done 48  49     until循环: 50        until CONDITION; do 51           循环体 52           循环控制变量的修正表达式 53        done 54  55        进入条件:当CONDITION为“假”时 56        退出条件:当CONDITION为“真”时 57  58        示例:求100以内正整数之和; 59        #!/bin/bash 60        # 61        declare -i sum=0 62        declare -i i=1 63  64        until [ $i -gt 100 ]; do 65          let sum+=$i 66          let i++ 67        done 68  69        echo "Sum:$sum." 70     练习1:分别求100以内所有偶数之和,以及所有奇数之和; 71     练习2:实现九九乘法表; 72     练习3:分别使用while和until循环实现添加10个用户:user-user10; 73  74    循环控制: 75      continue:提前结束本轮循环,而直接进入下一轮; 76      break [n]:提前结束循环; 77       78      while CONDTION;do 79        ....... 80        if CONDITION; then 81          break [n] 82         fi 83       done 84  85      while CONDTION;do 86        ....... 87        if CONDTION2; then 88          continue [n] 89         fi 90         ....... 91  92         示例:求100以内所有偶数之和; 93         #!/bin/bash 94         # 95         declare -i sum=0 96         declare -i i=0 97  98         while [ $i -le 100 ]; do 99           let i++100           if [ $[$i%2] -eq 1 ]; then101             echo "$i is a odd."102             continue103            fi104           let sum+=$i105         done106 107         echo "Sum:$sum."108 109      死循环:110        while true; do111           循环体112          if CONDITION; then113            break114           fi115         done116 117         until false; do118           循环体119          if CONDITION; then120            break121           fi122         done123 124       示例;每隔3秒钟查看当前系统是否有名为'gentoo'的用户登录;125         如果其次查看gentoo登录了,则显示gentoo已经登录;126         如果未登录,就显示仍然未开始,并显示这是已经是第多少次查看了;127 128         #!/bin/bash129         #130         username=$1131         declare -i count=0132 133         while true; do134          if who | grep "^$username" &> /dev/null; then135             echo "$username is logged."136             break137          else138            let count++139            echo "$count $username is not login."140           fi141          sleep 3142         done143 144       示例:2145 146         #!/bin/bash147         #148         declare -i count=0149         username=$1150 151         if [ $# -lt 1 ]; then152           echo "At lease one argument."153           exit 1154         fi155 156         if ! id $username &> /dev/null; then157           echo "No such user."158           exit 2159         fi160 161         until who | grep "^$username" &> /dev/null; do162           let count++163           echo "$count $username is not login."164           sleep 3165         done166         echo "$username is logged on."167 168 169     while循环的特殊用法:170       遍历文件的每一行:171         while read VARIABLE; do172           循环体173         done < /PATH/FROM/SOME_FILE174 175       示例:找出UID为偶数的所有用户显示其用户名和ID号;176       #!/bin/bash177       #178       while read line; do179         userid=$(echo $line | cut -d: -f3)180         if [ $[$userid%2] -eq 0 ]; then181          echo $line | cut -d: -f1,3182         fi183       done < /etc/passwd184 185 186     for循环的特殊用法:187      for((expr1;expr2;expr3)); do188         循环体189       done190 191       expr1:定义控制变量,并初始赋值;192       expr2:循环控制条件;193         进入条件:控制条件为“真”194         退出条件:控制条件为“假”195 196       expr3:修正控制变量197 198       示例:求100以内所有正整数之和;199 200    练习1:打印九九乘法表:201    练习2:传递一个文本文件为参数给脚本,取出此文件的所有的偶数行给予显示,行前要显示行号;202 203   函数:204     function:功能205      把一段具有独立功能代码封装在一起,并给予命名;后续用到时,可直接通过给定函数名来调用整体代码;206 207      函数作用:208        代码重用:209        模块化编程:210 211     函数的使用方法:212       先定义:编写函数代码213       后调用:给出函数名,还可以按需传递参数;214 215     定义方法:216     (1)function f_name {217          函数体218        }219     (2)f_name() {220          函数体221        }222 223     调用函数:224       f_name [argu1,argu2,...]225 226     自定义函数状态返回值:227       return [#]228          0:成功229          1-255:失败230          注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;231     示例:此前的服务脚本232 233     #!/bin/bash234     #235     prog=$(basename $0)236     lockfile="/var/lock/subsys/$prog"237     #echo $lockfile238 239     if [ $# -lt 1 ]; then240      echo "Usage: $prog start|stop|restart|status"241      exit 1242     fi243 244     start() {245       if [ -f $lockfile ]; then246         echo "$prog is started yes."247       else248        touch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed.."249       fi250     }251     stop() {252       if [ -f $lockfile ]; then253         rm -f $lockfile && echo "Stop $prog ok..." || echo "Stop $prog failed.."254       else255         echo "$prog is stopped yet."256       fi257     }258     restart() {259       if [ -f $lockfile ]; then260         rm -f $lockfile && touch $lockfile && echo "Restart $prog ok..."261       else262         touch $lockfile && echo "$prog is stopped, Starting $prog ok..."263       fi264     }265     status() {266       if [ -f $lockfile ]; then267         echo "Running..."268       else269         echo "Stopped..."270       fi271     }272 273     case $1 in274     start)275        start276        ;;277     stop)278       stop279        ;;280     restart)281        restart282        ;;283     status)284        status285        ;;286 287     *)288       echo "Usage: $prog start|stop|restart|status"289       exit 1290     esac291   示例:判断用户ID号的奇偶性292 293   #!/bin/bash294   #295   evenid() {296    if [ $# -lt 1 ]; then297      return 1298     fi299    300    if ! id $1 &> /dev/null; then301      return 2302     fi303    304    userid=$(id -u $1)305    if [ $[$userid%2] -eq 0 ]; then306      echo "$1,Even user ID."307    else308      echo "$1,Odd user ID."309     fi310   }311 312   evenid root313 314   evenid315   echo $?316 317   evenid rooooooot318   echo $?319 320   模块化编程321     示例:322      架设/root/bin/srv目录有两个文件:323      (1)函数文件324      (2)脚本文件325 326   为脚本使用配置文件327     一个文件中只定义变量328     脚本文件source此变量定义的文件329 330   变量的作用域:331      局部变量:332       local VARIABLE=value333 334      存活时间:335       函数执行开始,至函数返回结束;