概述
结构化命令case、for和while循环
1、case流程控制语句
简介:
case语句是用来是吸纳对程序流程的选择、循环、转向和返回等进行控制;
case是开关语句的一个组成部分;
它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的命令操作
适用于多分支的多个U型安泽语句
结构
case
变量或者是表达式
in
变量或者表达式1)
执行命令语句
;;(注意这个双分号)
变量或者表达式2)
执行命令语句
;;
..............
*)
默认的命令语句
esac
图解
执行的流程讲解
首先使用的是“变量表达式”的值与值1进行比较,如果相同就执行值1的命令,然后双分号结束;跳到esac,表示分支结束
如果与值1相比较不是这个值,就继续往下走,和值2进行比较,相同就执行命令2的内容
如此类推
如果什么值都匹配不到的话,就用*的默认命令
需要注意的事情
- 格式一定不能变,表达式后面就跟上in
- 每个变量选择值后需要跟上)
- 最后记得双分号;
- 如果匹配的是多个值的话可以使用|选择;
例子
编写一个case的语句选择
[root@node0 ~]# vim case-1.sh
#########################################
#!/bin/bash
#Author by liangjiawei
#########################################
cat << EOF
######################
#####1.Backup ########
#####2.Upgrade########
#####3.Remove ########
#####4.GoodBye########
######################
*****************************
EOF
read -p "Please select your choose:
" OP
case $OP in
1|Backup)
echo "this is Backup......"
;;
2|Upgrade)
echo "this is Upgrade......"
;;
3|Remove)
echo "This is Remove......."
;;
4|GoodBye)
echo "this is Bye"
;;
*)
echo "Please take the rule"
esac
[root@node0 ~]# bash case-1.sh
######################
#####1.Backup ########
#####2.Upgrade########
#####3.Remove ########
#####4.GoodBye########
######################
*****************************
Please select your choose:
1
this is Backup......
编写一个apache的启动脚本
[root@node0 ~]# vim apache.sh
#!/bin/bash
#Author By liagnjiawei
###############################
case $1 in
start)
systemctl $1 httpd
ps -aux | grep httpd
echo "httpd start"
;;
stop)
systemctl $1 httpd
ps -aux | grep httpd
echo
"httpd stop"
;;
status)
systemctl $1 httpd
;;
restart)
systemctl $1 httpd
echo "httpd restart"
;;
*)
echo "Usage : $0 start|stop|status|restart"
esac
[root@node0 ~]# bash apache.sh restart
httpd restart
[root@node0 ~]# bash apache.sh stop
root
7516
0.0
0.0 112724
964 pts/0
R+
23:29
0:00 grep httpd
httpd stop
2、for循环语句
for循环是直到满足条件它会自动跳出循环体
语法结构
for i in list
do
命令
done
for i in list;do
命令
done
例子
for循环的取值列表有很多种
可以直接读取in后面的数值
#练习一:取值列表都在in的后面,会依次读取
[root@node0 ~]# vim for-1.sh
#!/bin/bash
#Author By liangjiawei
##########################
for i in
aa bb cc dd
do
echo $i
done
[root@node0 ~]# bash for-1.sh
aa
bb
cc
dd
#练习二:如果取值有些带有空格那么就需要使用到引号或者是反斜杆来表示
[root@node0 ~]# vim for-1.sh
#!/bin/bash
#Author By liangjiawei
##########################
for i in
"liang jia wei"
$liangjiawei
`date` dd
do
echo $i
done
[root@node0 ~]# bash for-1.sh
liang jia wei
$liangjiawei
2021年
12月
16日
星期四
23:36:32
CST
dd
#练习三“从变量中取值
[root@node0 ~]# vim for-1.sh
#!/bin/bash
#Author By liangjiawei
##########################
list="aa bb cc dd ee"
for i in
$list
do
echo $i
done
[root@node0 ~]# bash for-1.sh
aa
bb
cc
dd
ee
#练习四:从命令中取值---->这里可以发现直接使用了破折号
[root@node0 ~]# vim for-1.sh
#!/bin/bash
#Author By liangjiawei
##########################
for i in
`cat /etc/hosts`
do
echo $i
done
[root@node0 ~]# bash for-1.sh
127.0.0.1
localhost
localhost.localdomain
localhost4
localhost4.localdomain4
::1
localhost
localhost.localdomain
localhost6
localhost6.localdomain6
#这里我们也发现好像文件默认的分隔符变了需要调整
自定义分隔符
在默认的情况下,bash shell会以空格、制表符、换行符等等作为分隔符;如果需要改到分隔符则要使用IFS来指定
#指定分隔符
[root@node0 ~]# vim for-1.sh
#!/bin/bash
#Author By liangjiawei
##########################
IFS=:
for i in
`cat /etc/hosts`
do
echo $i
done
[root@node0 ~]# bash for-1.sh
127.0.0.1
localhost localhost.localdomain localhost4 localhost4.localdomain4
1
localhost localhost.localdomain localhost6 localhost6.localdomain6
#这里就是使用:来做分隔符
$'n'和'n'换行符的区别
[root@node0 ~]# vim for-1.sh
#!/bin/bash
#Author By liangjiawei
##########################
IFS='n'
for i in
`cat /etc/hosts`
do
echo $i
done
~
[root@node0 ~]# bash for-1.sh
127.0.0.1
localhost localhost.localdomai
localhost4 localhost4.localdomai
4
::1
localhost localhost.localdomai
localhost6 localhost6.localdomai
6
[root@node0 ~]# bash for-1.sh
127.0.0.1
localhost localhost.localdomain localhost4 localhost4.localdomain4
::1
localhost localhost.localdomain localhost6 localhost6.localdomain6
for循环的C语言风格
[root@node0 ~]# vim for-2.sh
#!/bin/bash
#Author By liangjiawei
#############################
for ((i=0;i<10;i++))
do
echo
$i
done
[root@node0 ~]# bash for-2.sh
0
1
2
3
4
5
6
7
8
9
#i++代表的就是i由原始数据+1,i--也是同样的道理
#输出1-9 的升序和降序
[root@node0 ~]# vim for-2.sh
#!/bin/bash
#Author By liangjiawei
#############################
for ((i=0;b=9;i<10;i++;b--))
do
echo
number is $i and $b
done
[root@node0 ~]# bash for-2.sh
number is and 9
number is 1 and 8
number is 2 and 7
number is 3 and 6
number is 4 and 5
number is 5 and 4
number is 6 and 3
number is 7 and 2
number is 8 and 1
number is 9 and 0
3、while循环语句
这个就是不满足条件了就退出;
重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令条件不成立的时候跳出循环
结构
while 测试命令
do
命令
done
注意:避免陷入死循环的换就得是while true,或者是while :–>这两个的意思是一样的;
例子
降序输出10到1的数字
[root@node0 ~]# vim while_1.sh
#!/bin/bash
#Author By liangjiawei
#Used count 10 to 1
###############################################
VAR=10
#首先定义一个变脸
while [ $VAR -gt 0 ]
#然后使用while循环,当这个循环是到VAR的值大于或等于0的时候,继续循环,小于0的时候就跳出循环
do
echo $VAR
VAR=$[$VAR-1]
#这里是变脸的引用,使用中括号
done
#展示结果
[root@node0 ~]# bash while_1.sh
10
9
8
7
6
5
4
3
2
1
输出两个数值相乘的效果
- 脚本中注意两个知识点:如果想要自然增加的效果:let VAR++;相反,如果想要自然相减的效果: let VAR–
[root@node0 ~]# vim while_1.sh
#!/bin/bash
#Author By liangjiawei
#Used count 10 to 1
###############################################
VAR=1
while [ $VAR -lt 10 ]
do
SUM=$(( $VAR * $VAR
))
echo " $VAR * $VAR = $SUM"
(( VAR++ ))
#let VAR++
done
#展示效果
[root@node0 ~]# bash while_1.sh
1 * 1 = 1
2 * 2 = 4
3 * 3 = 9
4 * 4 = 16
5 * 5 = 25
6 * 6 = 36
7 * 7 = 49
8 * 8 = 64
9 * 9 = 81
嵌套循环的讲解
如果说想要批量添加用户;那么脚本应该如何下手?
解决的思路如下
- 明确你这个脚本的功能
- 编写脚本时候会遇到的哪些命令
- 把变化的数据使用变量来表示
- 选择合适的流程控制语句
[root@node0 ~]# vim for_useradd.sh
#!/bin/bash
#Author By liangjiawei
#Used add user
####################################
for name in `cat /root/user.txt`
#首先需要准备好这个user.txt文件
#for name in $(cat /root/user.txt)
#使用for循环,指定这个文件,把文件的内容复制给与name这个变量
do
id $name &> /dev/null
#判断这个用户名是否存在,用于执行if循环语句
if [ $? -ne 0 ];then
#如果操作成功则返回值为0,如果不存在,则是其他数值
useradd $name
echo "1" | passwd --stdin $name &> /dev/null
#这里代表不管输出的信息是什么都丢进黑洞
echo "user $name created"
else
echo "user $name is exist"
fi
done
[root@node0 ~]# vim user.txt
jenny
gary
tom
jim
rose
#然后执行脚本
[root@node0 ~]# bash for_useradd.sh
user jenny created
user gary created
user tom created
user jim created
user rose created
[root@node0 ~]# bash for_useradd.sh
user jenny is exist
user gary is exist
user tom is exist
user jim is exist
user rose is exist
九九乘法表打印
- 外层循环循环行、内层循环循环列
- 贵了:内层循环的变量要小于等于外城循环的变量
[root@node0 ~]# vim 99.sh
#!/bin/bash
#Author By liangjiawei
#Used display 99
#####################################
for i in `seq 9`
do
for j in `seq $i`
do
echo -n
"$i*$j=`echo $(($i*$j))` "
#这里需要注意空格的位置,不然不好看
done
echo "
"
done
[root@node0 ~]# bash 99.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
4、实战的3个脚本
将/opt、目录下的所有日志文件都全部自动打包
[root@node0 ~]# vim log-back.sh
#!/bin/bash
#Author By laingjiawei
#User Backup /opt
########################
SRC_DIR=/var/log/
DES_DIR=/opt/back/`date +%Y%m%d`
if
[ ! -d $DES_DIR ];then
mkdir -p $DES_DIR
fi
for i in `find $SRC_DIR -name "*.log"`
do
tar -czf $i.tar.gz $i
done
mv /var/log/*.tar.gz $DES_DIR
ls -lh $DES_DIR
echo "这个脚本已结束,打包完成"
找出 192.168.75.128-140中那些的服务器已经关机**
[root@node0 ~]# ^C
[root@node0 ~]# vim ping.sh
#!/bin/bash
#Author By liangjiawei
#Used ping ip
#########################
i=128
for ((i=128;i<140;i++))
do
ping -c 1 192.168.75.$i &> /dev/null
if [ $? -ne 0
];then
echo "192.168.75.$i 是关机状态"
else
echo "192.168.75.$i 是存在的"
fi
done
批量创建账户并且生成随机密码
[root@node0 ~]# vim add.sh
#!/bin/bash
#Author By liangjiawei
#used ADD user
#######################
for i in zhaoliu{1..10}
do
useradd $i
pass=`date +%s|md5sum|cut -c 1-8`
echo "$i:$pass" >>/tmp/passwd.log
echo $pass | passwd --stdin $i >/dev/null 2>&1
if [ $? -eq 0 ];then
echo "账户创建成功"
else
echo "账户创建失败"
fi
done
[root@node0 ~]# bash add.sh
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
最后
以上就是感性哈密瓜为你收集整理的结构化命令case、for和while循环的全部内容,希望文章能够帮你解决结构化命令case、for和while循环所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复