流程控制之for循环、select语句

for循环

一、语法

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

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

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 ...)

continue与break

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

拓展:ping命令参数

命令参数:

-d 使用Socket的SO_DEBUG功能。

-f  极限检测。大量且快速地送网络封包给一台机器,看它的回应。

-n 只输出数值。

-q 不显示任何传送封包的信息,只显示最后的结果。

-r 忽略普通的Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。

-R 记录路由过程。

-v 详细显示指令的执行过程。

<p>-c 数目:在发送指定数目的包后停止。

-i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。

-I 网络界面:使用指定的网络界面送出数据包。

-l 前置载入:设置在送出要求信息之前,先行发出的数据包。

-p 范本样式:设置填满数据包的范本样式。

-s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。

-t 存活数值:设置存活数值TTL的大小。(探测时间)

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

[root@web01 ~]# vim 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@web01 ~]# chmod +x file.sh 
[root@web01 ~]# ./file.sh a.txt /etc /root /abc
unknow.
/etc is directory.
/root is directory.
unknow.

案例5:可以直接在命令行编写for循环
#continue,跳过本次循环
#break结束循环

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

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

[root@web01 ~]# vim file.sh
#!/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

[root@web01 ~]# sh file.sh 
block 6
regular file 1
directory 18
unkown 127

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

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

案例8:添加30个用户,再将它们删除

[root@web01 ~]# vim user.sh
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@web01 ~]# 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
案例11:for循环实现九九乘法表
[root@m01 ~]# cat for1.sh 
for i in {1..9}
do
    for (( j=1;j<=i;j++ ))
    do 
       let "res=$i*$j"
       echo -n "$i*$j=$res" 
       echo -n "   " 
    done
    echo ""
done


[root@web01 ~]# sh test.sh 
第一层循环:loop0
	第二层循环:loop0
		第三层循环:loop0:000
		第三层循环:loop1:001
		第三层循环:loop2:002

#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

[root@web01 ~]# sh test.sh 
第一层循环:loop0
	第二层循环:loop0
		第三层循环:loop0:000
		第三层循环:loop1:001
		第三层循环:loop2:002
[root@web01 ~]# vim test.sh
[root@web01 ~]# sh test.sh 
第一层循环:loop0
	第二层循环:loop0
		第三层循环:loop0:000
		第三层循环:loop1:001
		第三层循环:loop2:002
第一层循环:loop1
	第二层循环:loop0
		第三层循环:loop0:100
		第三层循环:loop1:101
		第三层循环:loop2:102
第一层循环:loop2
	第二层循环:loop0
		第三层循环:loop0:200
		第三层循环:loop1:201
		第三层循环:loop2:202
第一层循环:loop3
	第二层循环:loop0
		第三层循环:loop0:300
		第三层循环:loop1:301
		第三层循环:loop2:302

流程控制之select语句

一、语法

select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择

select var in ...
do
	...
	break
done

二、案例

案例1:

[root@web01 ~]# vim select.sh
#!/bin/bash
PS3='choose one: ' # select默认使用PS3变量的值做提示符
echo
select var in {A..D}
do
    echo
    echo "your choose is $var"
    echo "OK"
    echo
    break # 跳出select,否则是死循环
done

[root@web01 ~]# sh select.sh 
1) A
2) B
3) C
4) D
choose one: 3

your choose is C
OK

案例二:

[root@web01 ~]# cat select.sh 
#!/bin/bash
PS3='选一个吧,小老弟: ' # select默认使用PS3变量的值做提示符
echo

select var
do
    echo
    echo "your choose is $var"
    echo "OK"
    echo
    break # 跳出select,否则是死循环
done

[root@web01 ~]# sh select.sh 苹果 梨 蔬菜 香蕉 茄子

1) 苹果
2) 梨
3) 蔬菜
4) 香蕉
5) 茄子
选一个吧,小老弟: 1

your choose is 苹果
OK
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值