循环结构
循环执行:
讲一段代码重复执行一次或多次
进入条件:条件满足时进入循环
退出条件:每一个循环都应该有退出条件,以有机会退出循环;
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条)
脚本的学习没有捷径,再理清楚基本语法后剩下的是多写,多看优秀代码,这样才能写出优秀的脚本,建议有时间去找找一些生产环境中实用的脚本,学习写写,作业完成的很好,继续保持。