linux12shell编程 -->流程控制之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

[root@openvpn day5]# cat for.sh 
#! /bin/bash

for i in `touch {1..10}.txt`
do
   echo $i
done
案例2:c语言风格的for
for ((i=1;i<=6;i++))
do
    echo $i
done
案例3:检查内网存活的ip,使用&符号提升脚本的运行效率
[root@openvpn day5]# cat ping.sh 
#!/bin/bash

for i in {1..254}
do
    (ping -c1 -t1  192.168.15.$i &>/dev/null

    if [ $? -eq 0 ];then
        echo "ping 192.168.15.$i up"
    else
        echo "ping 192.168.15.$i down"
    fi)&
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

[root@openvpn day5]# cat for2.sh 
 #! /bin/bash


 for i in {1..6}
 do
     if [ $i -eq 2 ];then
      continue
     fi 
     echo $i
done
[root@openvpn day5]# ./for2.sh 
1
3
4
5
6
案例6:统计etc下每种文件类型的数量
[root@openvpn day5]# cat dir_root.sh 
#! /bin/bash

DIR='/root/'
for i in `ls $DIR`
do
    if [ -f $DIR$i ];then
        ((file++))
    elif [ -d $DIR$i ];then
        ((directory++))
    else
        (unkown++)
    fi
done
echo 'regular file' $file
echo 'directory' $directory
echo 'unkown' $unkown
[root@openvpn day5]# ./dir_root.sh 
regular file 7
directory 1
unkown

[root@openvpn day5]# cat dir_etc.sh 
#!/bin/bash
dir='/etc'
block=0
file=0
directory=0
other=0
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
        ((other++))
    fi
done

echo 'block:' $block
echo 'regular file:' $file
echo 'directory:' $directory
echo  'other:' $other
[root@openvpn day5]# ./dir_etc.sh 
block: 0
regular file: 108
directory: 96
other: 0
案例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..10};
do
    useradd user$i&&echo "user$i create successful"
done


for i in {1..10};
do
    userdel -r user$i&&echo "user$i delete successful"
done
案例9:输入账号信息,输入个数,批量创建用户user01、user02、user03…,密码默认123
[root@openvpn day5]# cat user.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 123 | passwd --stdin $name$i &>/dev/null
    id $name$i &>/dev/null
    if [ $? -eq 0 ];then

        echo "$name$i create is ok" 
    else
        echo "$name$i create is failed"
    fi
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FikL-09-19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值