08@流程控制之for循环

流程控制之for循环

一、语法

#===========》Shell风格语法
for 变量名 [ in 取值列表 ]
do
	循环体
done

#===========》C语言风格语法
for ((初值;条件;步长))
do	
	循环体
done

1、shell风格的for,常用in列表方式

for i in 1 2 3
for i in {1,2,3}
for i in {1..9}
for i in {9..1}
for i in {a..z}
for i in {A..Z}
for i in {X..Z}
for i in $(命令)  # 例如:for i in $(head -10 /etc/passwd);do echo $i|cut -d: -f1,2;done
for i in $(find ...)

2、continue与for

continue#默认退出本次(这一次)循环

break#默认退出本层(整个)循环

二 案例

1、案例:shell风格的for

for i in {1..10}
do
    echo $i
done

2、案例:c语言风格的for

for ((i=1;i<=10;i++))  #运用语法条件限制引用变量
do
    echo $i
done

3、案例:检查内网存活的ip,使用&符号提升脚本的运行效率

#!/bin/bash

for i in {1..254}  #连续选择循环引用池内的变量内容
do
    (ping -W 1 -c 1 192.168.12.$i &> /dev/null && echo 192.168.12.$i) &
done

4、案例:编写文件类型测试脚本,支持多个参数

[root@egon /]# cat file.sh 
#!/bin/bash

for i in $@    #$@表示所有的任意一个或多个
do
	if [[ -d $i ]];then        #目录判断
    	echo "$i is directory."
	elif [[ -b $i  ]];then     
    	echo "$i is block device."
    elif [[ -f $i ]];then
    	echo "$i is a regular file."
    else
    	echo "unknow."
    fi
done
[root@egon /]# chmod +x file.sh 
[root@egon /]# 
[root@egon /]# ./file.sh a.txt /etc /root /abc   #设定目录进行查询(可以一个或多个)
a.txt is a regular file.
/etc is directory.
/root is directory.
unknow.

5、案例:可以直接在命令行编写for循环

[root@egon /]#  for i in {1..10};do [ $i -eq 5 ] && continue || echo $i;done
[root@egon /]#  for i in {1..10};do [ $i -eq 5 ] && break || echo $i;done

6、案例:统计dev下每种文件类型的数量

#!/bin/bash
dir='/dev'
for i in `ls $dir`
do
    if [ -b $dir/$i ];then
        ((block++))  # 或者 let block++,下同
    elif [ -f $dir/$i ];then
        ((file++))
         
    elif [ -d $dir/$i ];then
        ((directory++))
    else
        ((unkown++))
    fi
done

echo 'block' $block
echo 'regular file' $file
echo 'directory' $directory
echo 'unkown' $unkown

7、案例:检查用户

向脚本传递一个用户名,验证这个用户是否存在.

[root@egon ~]# cat testuser.sh 
#!/bin/bash
id $1 &> /dev/null
if [ $? -eq 0 ];then
    echo "用户$1存在"
else
    echo "用户$1不存在"
fi
[root@egon ~]# ./testuser.sh root
用户root存在

8、案例:用户提添加与删除

添加30个用户,再将它们删除

for i in {1..30};
do
    useradd user$i&&echo "user$i create successful"
done


for i in {1..30};
do
    userdel -r user$i&&echo "user$i delete successful"
done

9、案例:用户创建编写

输入账号信息,输入个数,批量创建用户user01、user02、user03…,密码默认123456

[root@egon shell]# cat adduser.sh 
#!/bin/bash

read -p "请输入创建的用户名信息: " name
read -p "请输入创建的用户数量: " count

for i in `seq -w $count`
do
    echo $name$i
    useradd $name$i &>/dev/null
    echo 123456 | passwd --stdin $name$i &>/dev/null
    id $name$i &>/dev/null
    [ $? -eq 0 ] && echo "$name$i create is ok" || echo "$name$i create is failed"
done

10、案例:嵌套多层for循环,结合break与continue(了解)

1#使用break:
break 默认参数是 1 
所以写 break 等于 break 1
意义:退出当前循环层
break 2 则向上退出2层循环 当前循环也计算在退出层次里

# 示例
for i in {0..3}
do
    echo -e "第一层循环:loop$i"
    for j in {0..3} 
    do
        echo -e "\t第二层循环:loop$j"
        for n in {0..3}
        do
            echo -e "\t\t第三层循环:loop$n:$i$j$n"
            if ((n==2));then
                break 3
            fi
        done
    done
done




2#使用continue
continue = continue 1
在当次循环中忽略continue后续的代码
就是:立即结束当前循环中的当次循环,而转入当前循环的下一次循环

continue 2 等同于 break 1
continue 3 等同于 break 2
总结:continue n 等同于 break n-1

for i in {0..3}
do
    echo -e "第一层循环:loop$i"
    for j in {0..3} 
    do
        echo -e "\t第二层循环:loop$j"
        for n in {0..3}
        do
            echo -e "\t\t第三层循环:loop$n:$i$j$n"
            if ((n==2));then
                continue 3
            fi
        done
    done
done

11、案列:编写99乘法表(for)

#!/bin/bash

for x in {1..9}
do
    for y in {1..9}; do
        if (( $y <= $x ));then
            echo -en "$y*$x=$(($y*$x))\t"     #(echo -e \t)相当于tab键, (echo -n)取消换行符 
        let y++
        fi
    done
    echo ""
    
    let x++

done


[root@web01 opt]# sh hzl.sh 
1*1=1	
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	


#案列二
#!/bin/bash
for ((j=1;j<=9;j++))
  do
for ((i=1;i<=j;i++))
  do
echo -e -n "${i}X${j}=$[${i}*${j}]\t"
  done
echo
done

[root@zabbix ~]# sh hzl.sh 
1X1=1	
1X2=2	2X2=4	
1X3=3	2X3=6	3X3=9	
1X4=4	2X4=8	3X4=12	4X4=16	
1X5=5	2X5=10	3X5=15	4X5=20	5X5=25	
1X6=6	2X6=12	3X6=18	4X6=24	5X6=30	6X6=36	
1X7=7	2X7=14	3X7=21	4X7=28	5X7=35	6X7=42	7X7=49	
1X8=8	2X8=16	3X8=24	4X8=32	5X8=40	6X8=48	7X8=56	8X8=64	
1X9=9	2X9=18	3X9=27	4X9=36	5X9=45	6X9=54	7X9=63	8X9=72	9X9=81	
posted @ 2021-06-19 15:32  ଲ一笑奈&何  阅读(96)  评论(0编辑  收藏  举报