我是靠谱客的博主 感性哈密瓜,最近开发中收集的这篇文章主要介绍结构化命令case、for和while循环,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

结构化命令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
20211216日
星期四
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循环所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部