Shell循环语句
Shell编程中提供了流程控制语句之选择语句,当然也有循环语句了,循环是只要条件成立就反复执行。Shell有两种形式的循环,一种是for,另外一种是while(until)。它们之间只是各自的语法跟使用方法的不同,所以只要一种循环能够实现的效果那么所有的循环语句都可以实现。
for:属于固定循环,执行for循环程序时要有进入条件和退出条件。
1 2 3 |
for VARIABLES_NAME in LIST; do statement1 done |
while:属于不定循环,也称作条件循环,只要条件判断式(CONDITON)成立就会一直循环,直到条件不成立才会终止循环;适用于循环次数未知的场景。
1 2 3 |
while CONDITION; do statement1 done |
1 2 3 |
while True/False; do statement1 done |
until:属于不定循环,和while循环正好相反,until循环是只要条件判断式(CONDITON)不成立则进行循环,一旦条件成立就会终止循环。
1 2 3 |
unitl CONDITION; do statement1 done |
循环控制语句
1 2 |
Continue #作用跳过本次循环中的剩余代码,直接跳到下一次循环中,continue N跳出N层循环; break #结束当前循环,break N跳出一层循环; |
循环相关知识点
一、数字列表生成方式
第一种,使用{};
1 |
$ echo {0..5} |
第二种,使用seq [起始数] [步进长度] 结束数;
1 2 3 4 5 |
$ seq 100 或 $ seq 1 100 或 $ seq 1 2 10 |
二、shift N:去掉第N个参数,使第N个参数后面的参数成为N,听起来有点绕。下面看一个实例就明白了。
1 2 3 4 5 6 7 8 9 10 |
$ cat test.sh #!/bin/bash # echo $1 shift 2 echo $1 shift 2 echo $1 $ ./test 1 2 3 4 5 1 3 5 |
显示结果1 3 5,其余的都被shift踢出去了,一般把shift运用在循环中。
三、变量声明
1 2 3 4 5 6 7 8 |
# 声明一个数据类型是整型; $ declare -i SUM=0 # 声明一个变量为环境变量; $ declare -x SUM=0 # 声明一个数据类型是数字而不是字符(bash默认是字符); $ let SUM=0 |
四、生成随机数
1 2 |
$ echo $RANDOM $ echo $[$RANDOM%5] |
For循环的几种用法
第一种
1 2 3 4 5 |
#!/bin/bash # for((i=1;i<=10;i++));do echo $(expr $i \* 4); done |
PS:变量i等于1,如果变量i小于或等于10就执行i++(就是变量i加1)。这种方式的for循环可以利用位置变量用来做一些日志检索类的小程序,如:
1 2 3 |
for((i=$1; i<=$2; i++));do zgrep -h -w "error" /var/dbbackup/log/world*/info/$i/* done |
其中$1可以接受查询起始日期,而$2可以是结束日期,然后在这个范围内一直去使用grep检索关键字error的信息。
第二种
1 2 3 4 5 |
#!/bin/bash # for i in $(seq 10);do echo $i done |
PS:利用seq生成循环数,然后变量i去调用并显示。
第三种
1 2 3 4 5 |
#!/bin/bash # for i in `ls`;do echo $i done |
PS:利用“去执行Linux系统的命令,然后变量i去调用并显示。
实例
01)脚本编程之:使用For循环计算1加到100的值
1 2 3 4 5 6 7 |
#!/bin/bash # declare -i SUM=0 for i in {1..100}; do let SUM=$[$SUM+$i] done echo $SUM |
02)脚本编程之:使用For循环检索出每个用户的shell
1 2 3 4 5 6 7 8 9 |
#!/bin/bash # FILE=/etc/passwd LING=`wc -l $FILE | cut -d' ' -f1` for i in `seq 1 $LING`; do echo "Hello: `head -$i $FILE | tail -1 | cut -d: -f1` Your Shell is: `head -$i $FILE | tail -1 | cut -d: -f7`" done echo "Total $LING users." |
03)脚本编程之:使用For循环找出UID大于等于500的用户
1 2 3 4 5 6 7 8 |
#!/bin/bash # name=`awk -F: '{print $3}' /etc/passwd` for i in $name; do if [ $i -ge 500 ]; then grep "$i" /etc/passwd | awk -F: '{print $1,$3,$7}' fi done |
04)脚本编程之:使用For循环计算1到100中基数相加的和
1 2 3 4 5 6 7 |
#!/bin/bash # let SUM=0 for i in `seq 1 2 100`; do let SUM=$SUM+$i done echo $SUM |
05)脚本编程之:使用For循环计算1到100中基数相加的和
1 2 3 4 5 6 7 |
#!/bin/bash # LIST=$(cat /root/user.txt) for name in $List; do useradd/userdel $name echo "1234567" | passwd -stdin $name done |
06)脚本编程之:使用For循环测试IP
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # for i in {1..10}; do ping -c 2 192.168.1.$i &> /dev/null if [ $? = 0 ]; then echo "Host 192.168.1.$i is up" else echo "Host 192.168.1.$i is down" fi done |
或
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash # LIST=$(cat /root/ip.txt) for i in $LIST;do ping -c 3 -w 3 $i &> /dev/null if [ $? = 0 ];then echo "host $i is up" else echo "host $i is down" fi done |
07)脚本编程之:使用For循环写可以根据参数添加或删除用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash # if [ $# -lt 1 ]; then echo "Usage: bash script.sh --add/--del USER1,USER2..." exit 1 fi if [ $1 = --add ]; then for i in `echo $2 | sed 's/,/ /g'`; do if id $i &> /dev/null; then echo "$i existed" else useradd $i echo $i | passwd --stdin $i &> /dev/null echo "$i add successful." fi done elif [ $1 = --del ]; then for i in `echo $2 | sed 's/,/ /g'`; do if id $i &> /dev/null; then userdel -r $i &> /dev/null echo "$i delete success." else echo "$i not exist." fi done else echo "Not found command. Usage: bash script.sh --add/--del USER1,USER2...." fi |
08)脚本编程之:使用while循环求1+…100的和
1 2 3 4 5 6 7 8 9 |
#!/bin/bash # declare -i i=1 declare -i SUM=0 while [ $i -le 100 ]; do let SUM+=i let i++ done echo $SUM |
09)脚本编程之:使用while循环
1 2 3 4 5 6 7 |
#!/bin/bash # read -t 5 -p "Input 'a-z' translation 'A-Z'/Input 'quit' Exit:" QUIT while [ $QUIT != quit ]; do echo $QUIT | tr 'a-z' 'A-Z' read -t 5 -p "Input 'a-z' translation 'A-Z'/Input 'quit' Exit:" QUIT done |
10)脚本编程之:使用while循环批量传文件
1 2 3 4 5 6 7 |
#!/bin/bash # while read GMSV do echo ----------$GMSV----------; scp -p /usr/local/etc/koei/gmsv_event.conf root@$GMSV:/usr/local/etc/koei/ done < /root/.adm/serverfile/server_gmsv |
11)脚本编程之:使用until循环检测用户是否登录
1 2 3 4 5 6 7 |
#!/bin/bash # until who | grep "openstack" &> /dev/null; do echo "Openstack is not login." sleep 3 done echo "Openstack login time is `date`." |