来源:https://blog.csdn.net/Powerful_Fy
for、while循环
for循环语法:for 变量名 in 条件; do …; done
示例一:打印1-100的数字并求和
#!/bin/bash
sum=0
for i in `seq 1 100`
do
sum=$[$sum+$i]
echo $i
done
echo $sum
seq1 2 10:打印结果1,3,5,7,9(2表示步长,打印结果间隔为2)
seq10 -2 1:打印结果10,8,6,4,2(倒序打印步长为负)
seq -w 1 10:打印结果01,02,03,04,05,06,07,08,09,10(-w 表示等宽)
示例二:打印指定目录下的文件
#!/bin/bash
cd /etc
for i in `ls /etc`
do
if [ -f $i ]
then
ls -l $i
fi
done
while循环语法:while 条件; do … ; done
示例一:平均1分钟负载大于5时,发送邮件
#!/bin/bash
while :
do
load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d . -f1`
if [ $load -gt 5 ]
then
d=`date +%F_%T`
top -nb1|mail -s "$d load is high: $load" asnfy@qq.com
fi
sleep 30
done
示例二:判断输入内容是否为空或包含非数字
#!/bin/bash
while :
do
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "you need input sth."
continue
fi
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "you just only input numbers."
continue
fi
break
done
echo "you input number is $n"
#如果输入的内容为空为包含非数字,continue跳出重新执行,否则break结束循环
补充:
当使用for遍历一个文件中的每行内容时(for i in `cat test`),如果某行中有一个或多个空格,这行的内容就会被当做两行或多行打印,为了避免这种情况可以使用while来循环输出文件中的每行内容
示例:
#!/bin/bash
cat test.txt|while read i
do
echo $i
done
#使用while遍历文件中的内容,即使某行有空格,也会被正常打印
break、continue、exit
break:直接结束循环
#!/bin/bash
for i in `seq 1 5`
do
echo "第一次输出:$i"
if(($i==3))
then
break
fi
echo "第二次输出:$i"
done
echo "循环结束"
执行结果:
[root@linux ~]# sh a.sh
第一次输出:1
第二次输出:1
第一次输出:2
第二次输出:2
第一次输出:3
循环结束
continue:忽略后面的代码,从新开始循环
#!/bin/bash
for i in `seq 1 5`
do
echo "第一次输出:$i"
if(($i==3))
then
continue
fi
echo "第二次输出:$i"
done
echo "循环结束"
执行结果:
[root@linux ~]# sh a.sh
第一次输出:1
第二次输出:1
第一次输出:2
第二次输出:2
第一次输出:3
第一次输出:4
第二次输出:4
第一次输出:5
第二次输出:5
循环结束
注意:循环支持嵌套,如果一个循环中嵌套了多个循环,break或continue只能作用于所在的某个循环中
exit:直接退出脚本
#!/bin/bash
for i in `seq 1 5`
do
echo "第一次输出:$i"
if(($i==3))
then
exit
fi
echo "第二次输出:$i"
done
echo "循环结束"
执行结果:
[root@linux ~]# sh a.sh
第一次输出:1
第二次输出:1
第一次输出:2
第二次输出:2
第一次输出:3
#循环外的echo语句没有输出,当脚本中遇到exit,会直接退出,后面所有内容都不再执行
补充:当脚本遇到exit直接退出后,echo $? 查看执行结果会显示0,表示执行成功,所以一般使用exit会在后面加上指定的非0数字,方便调用结果(比如:exit 5)