流程控制之for循环select语句
Posted givenchy_yzl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流程控制之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
[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
以上是关于流程控制之for循环select语句的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript的流程控制之for循环语句和while循环语句