循环结构
循环执行: 讲一段代码重复执行一次或多次 进入条件:条件满足时进入循环 退出条件:每一个循环都应该有退出条件,以有机会退出循环; bash脚本有三种循环方式: for循环: while循环: until循环: for循环: 两种格式: (1)遍历列表的格式 (2)通过控制变量来控制循环次数的方式 遍历列表: for VARAIBLE in LIST;do 循环体 done 进入条件:只要列表有可用元素,即可进入循环。 退出条件:列表中的元素遍历完成 LIST的生成方式: (1):直接给出 (2):整数列表 (a){start..end} (b)seq [start] [incremtal] last (3)返回列表的命令 (4)glob (5)变量引用 $@ $# #!/bin/bash # for username in user24 user25 user26; do if id $username &> /dev/null;then echo "$username exists" else useradd $username && echo "Add user $username finished." fi done [root@localhost ~]# bash -x /root/for/for1.sh + for username in user24 user25 user26 + id user24 + useradd user24 + echo 'Add user user24 finished.' Add user user24 finished. + for username in user24 user25 user26 + id user25 + useradd user25 + echo 'Add user user25 finished.' Add user user25 finished. + for username in user24 user25 user26 + id user26 + useradd user26 + echo 'Add user user26 finished.' Add user user26 finished. 上面是简单的使用for循环的方式 实例:求100以内所有正整数之和; #!/bin/bash # declare -i sum=0 for i in {1..100};do sum=$[$sum+$i] done echo $sum [root@localhost ~]# bash /root/for/sum.sh 5050 while循环: while CONDITION; do 循环体 done CONDITION :循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true” ,则执行一次循环;直到条件测试状态为“false” 终止循环 因此:CONDTION 一般应该有循环控制变量;而此变量的值会在循环体不断地被修正 进入条件:CONDITION 为true; 退出条件:CONDITION 为false until循环: until CONDITION; do 循环体 done 进入条件: CONDITION 为false 退出条件: CONDITION 为true 循环控制语句:continue 用于循环体中 continue [N] :提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层 while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done 实例: #!/bin/bash # # # i=0 while [ $i -lt 9 ];do let i++ [ $i -eq 5 ] && continue echo "$i" done [root@localhost ~]# bash /root/tiaochu/continue.sh 1 2 3 4 6 7 8 9 [root@localhost ~]# 前期运行错误分析: 代码如下: #!/bin/bash # # # i=0 while [ $i -lt 9 ];do [ $i -eq 5 ] && continue echo "$i" let i++ done 运行结果如下: [root@localhost ~]# bash /root/tiaochu/continue.sh 0 1 2 3 4 脚本没有跳出本次循环执行下次循环,也没有退出程序。 分析后得出结果:在循环中,代码let i++写在了continue跳出语句的后面,导致变量i的值一直处于符合跳出条件i=5,所以每次执行的都是跳出本次循环的操作。无法执行下面的let i++。修改后如此前写的那样,程序正常运行。在后面的操作中要注意此类问题。!!!!!! 循环控制语句:break 用于循环体中 break [N] :提前结束第N层循环,最内层为第1层 while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done 实例: #!/bin/bash # # # i=0 while [ $i -lt 9 ];do [ $i -eq 5 ] && break echo "$i" let i++ done [root@localhost ~]# bash /root/tiaochu/continue.sh 0 1 2 3 4 [root@localhost ~]# 对于在使用continue中遇到的问题,在break语句中不会出现同样的情况,应为continue语句是跳出当前正在执行的本轮循环,而break语句是跳出整个循环程序。 创建无限循环 while true; do 循环体 done until false; do 循环体 done 1 、判断/var/ 目录下所有文件的类型 filetype.sh #!/bin/bash # for filename in /var/* ;do if [[ -S $filename ]];then echo "Socket file" elif [[ -L $filename ]];then echo "Symbolic file" elif [[ -d $filename ]];then echo "Directory file" elif [[ -b $filename ]];then echo " Block special file" elif [[ -c $filename ]];then echo "character special file" elif [[ -p $filename ]];then echo "Named pipe file" elif [[ -f $filename ]];then echo "Common file" else echo "Other file" fi done 2、 、 添加10个 用户user1-user10 ,密码 同 用户名 useradd.sh #!/bin/bash # for username in {20..30};do if id user$username &> /dev/null;then echo "user$username"|passwd --stdin user$username &> /dev/null else useradd user$username echo "user$username"|passwd --stdin user$username &> /dev/null echo "add user user$username finished." fi done 3 、/etc/rc.d/rc3.d 目录下分别有多个以K 开头和以S 开头的 文件 ;分别 读取每个文件,以K 开头的文件输出为文件加stop ,以S 开头的文件输出为文件名加start; ; “ “K34filename stop” “S66filename start” fileadd.sh #!/bin/bash # for filename in /etc/rc.d/rc3.d/*;do if [[ $filename =~ /.*/+[kK].*$ ]];then echo "$filename" |sed -r 's@/.*/+([kK].*)$@\1@' &> /dev/null echo "${filename}stop" elif [[ $filename =~ /.*/+[sS].*$ ]];then echo "$filename" |sed -r 's@/.*/+([Ss].*)$@\1@' &> /dev/null echo "${filename}start" else echo "Other" fi done 4 、编写脚本 ,提示输入正整数n 的值,计算1+2+3+…n 的总 和 numsum.sh #!/bin/bash # read -p "enter a integer::" num sum=0 if [ -n $num -a $num -gt 0 ];then expr $num + 0 &> /dev/null if [ `echo $?` -eq 0 ];then for i in `seq 1 $num`;do sum=$[$sum+$i] done echo "$sum" else echo "enter a integer" fi else echo "enter a integer" fi 5、 、 打印九九乘法表 chengfabiao.sh #!/bin/bash # #!/bin/bash # # read -p "请输入要打印的行数::" n echo "==========================================" for i in `seq $n` do kd=$[$n-$i] for k in `seq $kd` do echo -n " " done qd=$[2*$i-1] for q in `seq $qd` do echo -n "*" done echo done echo "==========================================" for ((i=1;i<=n;i++)) do for ((k=1;k<=n-i;k++)) do echo -n " " done for ((j=1;j<=2*i-1;j++)) do echo -n "*" done echo done echo "==========================================" i=1 while [ $i -le $n ] do j=1 k=$[$n-$i] while [ $j -le $k ] do echo -n " " ((j++)) done q=1 qd=$[2*$i-1] while [ $q -le $qd ] do echo -n "*" ((q++)) done echo ((i++)) done echo "==========================================" i=1 until [ $i -gt $n ] do j=1 k=$[$n-$i] until [ $j -gt $k ] do echo -n " " ((j++)) done q=1 qd=$[2*$i-1] until [ $q -gt $qd ] do echo -n "*" ((q++)) done echo ((i++)) done echo "=========================================="
原创文章,作者:dxkboke,如若转载,请注明出处:http://www.178linux.com/38586
评论列表(1条)
脚本的学习没有捷径,再理清楚基本语法后剩下的是多写,多看优秀代码,这样才能写出优秀的脚本,建议有时间去找找一些生产环境中实用的脚本,学习写写,作业完成的很好,继续保持。