当前位置:   article > 正文

结构化命令case、for和while循环_while case

while case

结构化命令case、for和while循环

1、case流程控制语句

简介:

case语句是用来是吸纳对程序流程的选择、循环、转向和返回等进行控制;

case是开关语句的一个组成部分;

它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的命令操作

适用于多分支的多个U型安泽语句

结构
case   变量或者是表达式   in
	变量或者表达式1)
		执行命令语句
		;;(注意这个双分号)
	变量或者表达式2)
		执行命令语句
		;;	
	..............
	*)
	默认的命令语句
esac

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
图解

执行的流程讲解

首先使用的是“变量表达式”的值与值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......

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

编写一个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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

2、for循环语句

for循环是直到满足条件它会自动跳出循环体

语法结构
for i in list
	do
		命令
	done
	
for i in list;do
	命令
	done
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
例子

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

	#这里我们也发现好像文件默认的分隔符变了需要调整
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
自定义分隔符

在默认的情况下,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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

3、while循环语句

这个就是不满足条件了就退出;

重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令条件不成立的时候跳出循环

结构
while 测试命令
do
	命令
done
  • 1
  • 2
  • 3
  • 4

注意:避免陷入死循环的换就得是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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

输出两个数值相乘的效果

  • 脚本中注意两个知识点:如果想要自然增加的效果: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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
嵌套循环的讲解

如果说想要批量添加用户;那么脚本应该如何下手?

解决的思路如下

  • 明确你这个脚本的功能
  • 编写脚本时候会遇到的哪些命令
  • 把变化的数据使用变量来表示
  • 选择合适的流程控制语句
[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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

九九乘法表打印

  • 外层循环循环行、内层循环循环列
  • 贵了:内层循环的变量要小于等于外城循环的变量
[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   

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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 "这个脚本已结束,打包完成"


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

找出 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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

批量创建账户并且生成随机密码

[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 
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
账户创建成功
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/319551
推荐阅读
相关标签
  

闽ICP备14008679号