博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
十六周四次课
阅读量:6157 次
发布时间:2019-06-21

本文共 6418 字,大约阅读时间需要 21 分钟。

20.10 for循环

语法:for 变量名 in 条件; do …; done

#!/bin/bashfor i in `seq 1 100`doecho $idone

案例1

#!/bin/bashsum=0for i in `seq 1 100`dosum=$[$sum+$i]echo $idoneecho $sum
[root@aiker02 script]# !vimvim for0.shecho $i#!/bin/bashsum=0for i in `seq 1 100`dosum=$[$sum+$i]doneecho $sum"for0.sh" 7L, 73C written
[root@aiker02 script]# sh -x !$sh -x for0.sh+ echo 50505050
[root@aiker02 script]# cat !$cat for0.sh#!/bin/bashsum=0for i in `seq 1 100`doecho "$sum+$i"sum=$[$sum+$i]echo $sumdone
[root@aiker02 script]# !vvim for1.sh#!/bin/bashcd /etc/for a in `ls /etc`do[ -d $a ] && ls $aif [ -d $a ]thenecho $aecho "`pwd`/$a"ls $afidone
[root@aiker02 script]# for i in `seq 1 3`; do echo $i; done123
[root@aiker02 script]# for i in 1 2 3; do echo $i; done123

注意for在遍历目录时会把空格或者回车作为分隔符

[root@aiker02 script]# lltotal 64-rw-r--r-- 1 root root  0 Apr 15 16:27 1-rw-r--r-- 1 root root  0 Apr 15 16:27 2-rw-r--r-- 1 root root  0 Apr 15 16:27 3 4.txt[root@aiker02 script]# mkdir textdir[root@aiker02 script]# mv 1 2 3\ 4.txt textdir/1234.txt
[root@aiker02 script]# for i in `ls ./textdir`; do echo $i; done1234.txt
[root@aiker02 script]# for i in `ls ./textdir`; do printf "$i\n"; done1234.txt

通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:

#!/bin/bashfor((i=1;i<=5;i++));doecho "这是第 $i 次调用";done;

与 C 中相似,赋值和下一步执行可以放到代码之前循环语句之中执行,这里要注意一点:如果要在循环体中进行 for 中的 next 操作,记得变量要加 $,不然程序会变成死循环。

20.11/20.12 while循环

语法 while 条件; do … ; done

案例1

#!/bin/bashwhile :  ##:相当于true,可以使用while truedo  load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`  if [ $load -gt 10 ]  then      /bin/mail.py aikeav@qq.com "load is high" $load  fi  sleep 30done
[root@aiker02 script]# sh -x while0.sh + :++ head -1++ awk -F 'load average: ' '{print $2}'++ cut -d. -f1++ w+ load=0+ '[' 0 -gt 10 ']'+ sleep 30+ :++ head -1++ awk -F 'load average: ' '{print $2}'++ cut -d. -f1++ w+ load=0+ '[' 0 -gt 10 ']'+ sleep 30+ :++ head -1++ awk -F 'load average: ' '{print $2}'++ cut -d. -f1++ w+ load=0+ '[' 0 -gt 10 ']'+ sleep 30^C

while循环: 格式:

while command     do     command     command     command     ... done
[root@aiker02 script]# !vimvim while1.sh #!/bin/bashwhile :do  read -p "please input a number:" n  if [ -z $n ]  then      echo 'You need input a string.'      continue  fi  n1=`echo $n | sed 's/[0-9]//g'`  if [ -n "$n1" ]  then      echo "You must input numbers"      continue  fi  breakdoneecho $n
[root@aiker02 script]# !shsh -x while1.sh+ :+ read -p 'please input a number:' nplease input a number:12323+ '[' -z 12323 ']'++ sed 's/[0-9]//g'++ echo 12323+ n1=+ '[' -n '' ']'+ break+ echo 1232312323
[root@aiker02 script]# !vimvim while2.sh#!/bin/bashi=1while [ $i -le 5 ]do sq=`expr $i \* $i`echo $i $i的平方是 $sqi=`expr $i + 1`doneecho "Job is done."
[root@aiker02 script]# sh !$sh while2.sh1 1的平方是 12 2的平方是 43 3的平方是 94 4的平方是 165 5的平方是 25Job is done.

20.13 break跳出循环

• 从循环中退出: break和continue命令 break 立即退出循环 continue 忽略本循环中的其他命令,继续下一下循环 在shell编程中有时我们要用到进行无限循环的技巧,也就是说这种循环一直执行碰 到break或continue命令。这种无限循环通常是使用true或false命令开始的。UNIX 系统中的true总是返0值,而false则返回非零值。如下所示

while true             until false         do                 docommand              command ....                  .... command              command done                  done

break命令允许跳出所有循环(终止执行后面的所有循环)

[root@aiker02 script]# vim break.sh#!/bin/bashfor i in `seq 1 5`do    echo $i    if [ $i -eq 3 ]    then       break    fi    echo $idoneecho "job is done"
[root@aiker02 script]# sh break.sh 11223job is done
[root@aiker02 script]# sh -x break.sh ++ seq 1 5+ for i in '`seq 1 5`'+ echo 11+ '[' 1 -eq 3 ']'+ echo 11+ for i in '`seq 1 5`'+ echo 22+ '[' 2 -eq 3 ']'+ echo 22+ for i in '`seq 1 5`'+ echo 33+ '[' 3 -eq 3 ']'+ break+ echo 'job is done'job is done

20.14 continue结束本次循环

忽略continue之下的代码,直接进行下一次循环

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环

[root@aiker02 script]# vim continue.sh#!/bin/bashfor i in `seq 1 5`do    echo $i    if [ $i -eq 3 ]    then       continue    fi    echo $idoneecho "job is done"
[root@aiker02 script]# sh continue.sh 112234455job is done

20.15 exit退出整个脚本

[root@aiker02 script]# cp continue.sh exit.sh[root@aiker02 script]# vim !$vim exit.sh#!/bin/bashfor i in `seq 1 5`do    echo $i    if [ $i -eq 3 ]    then       exit    fi    echo $idoneecho "job is done"
[root@aiker02 script]# sh exit.sh 11223
[root@aiker02 script]# !vimvim exit.sh#!/bin/bashfor i in `seq 1 5`do    echo $i    if [ $i -eq 3 ]    then       exit 2    fi    echo $idoneecho "job is done"
[root@aiker02 script]# sh exit.sh 11223[root@aiker02 script]# echo $?2

扩展

select用法

select也是循环的一种,它比较适合用在用户选择的情况下。

比如,我们有一个这样的需求,运行脚本后,让用户去选择数字,选择1,会运行w命令,选择2运行top命令,选择3运行free命令,选择4退出。脚本这样实现:

#!/bin/bashecho "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"echoselect command in w top free quitdo    case $command in    w)        w        ;;    top)        top        ;;    free)        free        ;;    quit)        exit        ;;    *)        echo "Please input a number:(1-4)."        ;;    esacdone

执行结果如下:

sh select.shPlease chose a number, 1: run w, 2: run top, 3: run free, 4: quit1) w2) top3) free4) quit#? 116:03:40 up 32 days,  2:42,  1 user,  load average: 0.01, 0.08, 0.08USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHATroot     pts/0    61.135.172.68    15:33    0.00s  0.02s  0.00s sh select.sh#? 3             total       used       free     shared    buffers     cachedMem:       1020328     943736      76592          0      86840     263624-/+ buffers/cache:     593272     427056Swap:      2097144      44196    2052948#?

我们发现,select会默认把序号对应的命令列出来,每次输入一个数字,则会执行相应的命令,命令执行完后并不会退出脚本。它还会继续让我们再次输如序号。序号前面的提示符,我们也是可以修改的,利用变量PS3即可,再次修改脚本如下:

#!/bin/bashPS3="Please select a number: "echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"echoselect command in w top free quitdo    case $command in    w)        w        ;;    top)        top        ;;    free)        free        ;;    quit)        exit        ;;    *)        echo "Please input a number:(1-4)."    esacdone

如果想要脚本每次输入一个序号后就自动退出,则需要再次更改脚本如下:

#!/bin/bashPS3="Please select a number: "echo "Please chose a number, 1: run w, 2: run top, 3: run free, 4: quit"echoselect command in w top free quitdo    case $command in    w)        w;exit        ;;    top)        top;exit        ;;    free)        free;exit        ;;    quit)        exit        ;;    *)        echo "Please input a number:(1-4).";exit    esacdone

转载于:https://blog.51cto.com/235571/2140095

你可能感兴趣的文章
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>
Yii2单元测试初探
查看>>
五、字典
查看>>
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>
检测oracle数据库坏块的方法
查看>>
SQL server 安装教程
查看>>
Linux下ftp和ssh详解
查看>>
跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击
查看>>
js时间和时间戳之间如何转换(汇总)
查看>>
js插件---图片懒加载echo.js结合 Amaze UI ScrollSpy 使用
查看>>
java中string和int的相互转换
查看>>
P1666 前缀单词
查看>>
HTML.2文本
查看>>