赞
踩
case语句是用来是吸纳对程序流程的选择、循环、转向和返回等进行控制;
case是开关语句的一个组成部分;
它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的命令操作
适用于多分支的多个U型安泽语句
case 变量或者是表达式 in
变量或者表达式1)
执行命令语句
;;(注意这个双分号)
变量或者表达式2)
执行命令语句
;;
..............
*)
默认的命令语句
esac
执行的流程讲解
首先使用的是“变量表达式”的值与值1进行比较,如果相同就执行值1的命令,然后双分号结束;跳到esac,表示分支结束
如果与值1相比较不是这个值,就继续往下走,和值2进行比较,相同就执行命令2的内容
如此类推
如果什么值都匹配不到的话,就用*的默认命令
需要注意的事情
编写一个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
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
[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
这个就是不满足条件了就退出;
重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令条件不成立的时候跳出循环
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
输出两个数值相乘的效果
[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
将/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 账户创建成功 账户创建成功 账户创建成功 账户创建成功 账户创建成功 账户创建成功 账户创建成功 账户创建成功 账户创建成功 账户创建成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。