linux 第二章 shell编程及自动化运维--判断

linux 第二章 shell编程及自动化运维–判断

一、前言

无论什么编程语言都离不开条件判断(流控)。shell也不例外

例如:用户输入的密码不够长时提醒用户,你太短了

例如:用户输入了备份的目录,如果有目录继续备份,如果没有目录创建目录

例如:用户输入成绩,如果100-80评为优秀,如果60-79评为合格,如果59-0评为不合格

二、shell 条件测试

1、数值比较【整数1 操作符 整数2】

操作符:

[20 -gt 10] 大于
[1 -lt 10] 小于
[1 -eq 1] 等于
[1 -ne 10] 不等于
[20 -ge 10] 大于等于
[10 -le 10] 小于等于

示例:

需求:猜测用户输入的密码,是否满足长度需求

脚本:

  • 变量长度:
[root@localhost ~] pass=12345
[root@localhost ~] echo $pass
12345
[root@localhost ~] echo ${#pass}  #必须用${#}来调用
5
[root@localhost ~] aaa=123456  ;  echo ${#aaa}
6
  • 测试语法:

格式1:test 条件表达式

[root@localhost ~] aaa=123 ; test $aaa -ge 7 ; echo $?    #$aaa调用的是数字123>=7  正确的输出0
0
[root@localhost ~] aaa=abc ; test ${#aaa} -ge 7 ; echo $?   #${#aaa}调用的是长度  3>=7  错误输出1
1
[root@localhost ~] test 8 -ge 7  ; echo $?
0 
[root@localhost ~] [ 8 -gt 7 ] ; echo $? #中括号必须与数字分开,和上面等价都是测试条件的
0

格式2:[条件表达式]

[root@localhost ~] aaa=abc ; [ ${#aaa} -ge 7 ] ; echo $?   #${#aaa}调用的是长度  3>=7  错误输出1
1

格式3:[[条件表达式]]

[root@localhost ~] aaa=abc ; [[ ${#aaa} -ge 7]] ; echo $?   #${#aaa}调用的是长度  3>=7  错误输出1
1
  • if语法结构:
if
then
else
fi
[root@localhost ~] vim  pass.sh
#!/bin/bash
read -p "请输入您的密码:"  h
if [ ${#h} -lt 7  ]
then
echo "您的密码太短"
else
echo "您的密码真长"
fi
[root@localhost ~] .  pass.sh
请输入您的密码:3333
您的密码太短
[root@localhost ~] .  pass.sh
请输入您的密码:21333333333
您的密码真长

2、文件测试【操作符 文件或目录】

操作符

在这里插入图片描述

示例

需求:请用户输入备份路径,如果存在提示已存在可以备份,如果不存在提示目录不存在请创建

[root@localhost ~] vim path.sh
#!/bin/bash
read -p "请输入备份的目录:"  dir1
if test -d $dir1
then
echo "$dir1 存在,可以备份"
else
echo "$dir1 不存在,自动创建目录。"
mkdir $dir1
echo "$dir1 已创建"
fi

[root@localhost ~] chmod +x path.sh
[root@localhost ~]# . path.sh
请输入备份的目录:/abc
/abc 存在,可以备份

[root@localhost ~]# . path.sh
请输入备份的目录:/def
/def 不存在,自动创建目录。
/def 已创建

[root@localhost ~]# ls /
abc  boot  dev  hhh   hyb  lib64  media  opt   root  sbin   srv  tmp  var
bin  def   etc  home  lib  lswj   mnt    proc  run   shell  sys  usr
[root@localhost ~] mkdir /abc
[root@localhost ~] ls /
abc  boot  etc  home  lib    lswj   mnt  proc  run   shell  sys  usr
bin  dev   hhh  hyb   lib64  media  opt  root  sbin  srv    tmp  var
[root@localhost ~] test  -d /abc ; echo $?
0
[root@localhost ~] test  -d /def ; echo $?
1
[root@localhost ~] [ -d /abc ] ; echo $?
0
[root@localhost ~] [[ -d /abc ]] ; echo $?
0

3、字符串比较【“字符串”=“字符串”】

=等于 !=

需求:邀请用户确认,yes升级装备,no不升级装备

脚本:

[root@localhost ~] vim select.sh
#!/bin/bash
read -p "您确定要升级这件装备吗? [yes/no]"  select
if [ "$select" = "yes"  ]
then
echo "装备升级开始"
else
echo "感谢您,欢迎下次光临"
fi
测试:
[root@localhost ~] chmod +x select.sh 
[root@localhost ~] . select.sh 
您确定要升级这件装备吗? [yes/no]no
感谢您,欢迎下次光临
[root@localhost ~] . select.sh 
您确定要升级这件装备吗? [yes/no]yes
装备升级开始
-z:判断字符长度是为0(了解)
[root@localhost ~] BBB="" ; test -z $BBB ; echo $?
0
[root@localhost ~] BBB="aed" ; test -z $BBB ; echo $?
1
-n:判断字符长度不是0
[root@localhost ~] BBB="aed" ; test -n $BBB ; echo $?
0

4、and和or

简介
  • 当条件测试比较复杂时,需要多个条件同时成立,就需要混合条件测试了
  • 逻辑的(and)与(or)
  • &&逻辑的and的意思,-a,两个条件同时成立,为真
  • ||逻辑的or的意思,-o,两个条件一个成立,为真
示例

猜测用户输入的密码是否满足如下条件:

1、长度大于等于7位

2、包含字母大写

3、包含字母小写

4、包含符号“@!_”
注意:
字符表达式的比较使用 [[ ]] ,其运算符 =、!=、-n、-z
文件表达式的测试使用 [[ ]] ,其运算符 -r、-l、-w、-x、-f、-d、-s、-nt、-ot
逻辑表达式的测试使用 [[ ]] ,其运算符 !、&&、||
数字比较、字符比较、逻辑测试可以组合,如$ [[ “a” != “b” && 4 -gt 3 ]]

[root@localhost ~] vim  pass.sh
#!/bin/bash
read -p "请输入您的密码:"  pass
if [ ${#pass} -gt 7 ] && [[ ${pass} =~ [a-z] ]]  && [[ ${pass} =~ [A-Z]  ]]  &&  [[ ${pass} =~ [@_!] ]]
then
echo "yes"
else
echo "no"
fi

[root@localhost ~] chmod +x pass.sh
[root@localhost ~]# . pass.sh 
请输入您的密码:123456
no
root@localhost ~]# . pass.sh 
请输入您的密码:123A2c!1        
yes
[root@localhost ~] vim  pass.sh
#!/bin/bash
read -p "请输入您的密码:"  pass
if [ ${#pass} -gt 7 ] || [[ ${pass} =~ [a-z] ]]  || [[ ${pass} =~ [A-Z]  ]]  ||  [[ ${pass} =~ [@_!] ]]  || [[  ${pass}  =~ [{0-9] ]]
then
echo "yes"
else
echo "no"
fi
[root@localhost ~]# vim  pass.sh 
[root@localhost ~]# . pass.sh 
请输入您的密码:1
yes
[root@localhost ~]# . pass.sh 
请输入您的密码:rd
yes

三、流程控制:if

单分支结构

语法

if  [ command/test ]  ;   then  符合条件执行的语句   fi

示例

需求:编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码123456

[root@localhost ~]# vim usr.sh
#!/bin/bash
read -p "请输入用户名:"  name
id $name &> /dev/null
if [ $? -ne 0 ]
then
useradd $name
echo "$name 用户已创建"
fi

[root@localhost ~] vim usr.sh
[root@localhost ~] . usr.sh
请输入用户名:hyb
[root@localhost ~] . usr.sh
请输入用户名:111
111 用户已创建 

双分支结构

语法

if 条件测试
then
命令序列
else
命令序列
fi

示例

需求:编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,否则,提示用户已经存在

[root@localhost ~]# vim usr.sh
#!/bin/bash
read -p "请输入用户名:"  name
id $name &> /dev/null
if [ $? -ne 0 ]
then
useradd $name
echo "$name 用户已创建"
else
echo "$name 用户已存在"
fi

[root@localhost ~]# . usr.sh
请输入用户名:root
root 用户已存在
[root@localhost ~]# . usr.sh
请输入用户名:444   
444 用户已创建

多分支结构

  • 语法:

多分支结构

if 条件测试1

then 命令序列

elif 条件测试2

then 命令序列

elif 条件测试3

then 命令测试…

else 命令序列

fi

  • 示例

需求:编写脚本,取出系统时间的小时,对数字进行判断

6-10 this is morning

11-13 this is noon

14 -18 this is afternoon

其他 this isnight

[root@localhost ~] vim  time.sh
#!/bin/bash
#hyb
#2022/11/9 16:32
#调用系统时间测试多分支语句

hour=`date +%H`

if [ $hour -ge 6 -a $hour -le 10 ] ; then
echo "morning $USER...."

elif [ $hour -ge 11 -a $hour -le 13 ] ; then
echo "this is noon $USER "

elif [ $hour -ge 14 -a $hour -le 18 ] ; then
echo "this is afternoon $USER"

else
echo "This is night $USER"
fi

[root@localhost ~] . time.sh 
this is afternoon root

把要执行的文件放到自启动脚本文件里边

[root@localhost ~] vim ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
bash /root/time.sh   #我们新添加的是这条          

嵌套结构(了解)

需求
在这里插入图片描述

[root@localhost ~] vim user.sh
#!/bin/bash
#hyb
#2022/11/9  20:52
#邀请用户输入待创建用户名
read  -p "请您输入需要创建的用户名:"  user

if id $user &> /dev/null
        then
          echo "用户已存在"
        else
           useradd $user
           read -s -p "请您输入密码:" pass         #-s秘文输入
             if [ ${#pass} -gt 7  ]
                  then
                    echo $pass | passwd --stdin $user &> /dev/null
                    echo "$user 密码已创建,密码为:$pass"
                  else
                echo "密码长度小于7无法创建。"
             fi
fi



[root@localhost ~] bash user.sh 
请您输入需要创建的用户名:43
请您输入密码:43 密码已创建,密码为:12345678
[root@localhost ~] id 43
uid=1004(43) gid=1004(43)=1004(43)
[root@localhost ~] bash user.sh
请您输入需要创建的用户名hyb
用户已存在

优化脚本并调试
#hyb
#2022/11/9  20:52
#邀请用户输入待创建用户名
read  -p "请您输入需要创建的用户名:"  user

if id $user &> /dev/null
then
          echo "用户已存在"
          read -p "是否修改或添加用户密码:[yes/no]" num1
            #二.一级嵌套开始处
            if [ $num1 = "yes"  ]

            then
             read -s -p  "请输入要修改或添加的密码:"  pass1
             echo $pass1 | passwd --stdin $user  &> /dev/null
             echo "$user 密码已修改为:$pass1"

            fi
            #二.一级嵌套结束处
else
           useradd $user
           read -s -p "请您输入密码:" pass
            #二.二级嵌套开始处
             if [ ${#pass} -ge 3  ]

             then
                    echo $pass | passwd --stdin $user &> /dev/null
                    echo "$user 密码已创建,密码为:$pass"
             else
                    echo "您的密码太短!"

             fi
             #二.二级嵌套结束处
fi
~                          

调试脚本

[root@localhost ~] bash -n time.sh #仅调试脚本中的错误语法,如果没错执行没结果 
[root@localhost ~] bash -xv /jiao_ben/user.sh #以调试的方式执行,查询整个执行过程

注意

在这里插入图片描述

四、模式匹配:case

前言:shell编程中if和case都是用来做流控的

案例1:简单的模式匹配

邀请用户输入待删除的用户名。询问用户,确定要继续删除吗 yes/no:

if写法:

[root@localhost ~] vim userdul.sh
#!/bin/bash
read -p "请您输入等待删除的用户名:"  user
read -p "确认删除吗?[yes/no]"  action
if [ "$action" = "y" -o "$action" = "Y"   -o  "$action" = "yes" ]
                then
                        userdel -r $user 
                else
                        echo "谢谢你,再见"
fi
[root@localhost ~] bash userdul.sh 
请您输入等待删除的用户名:hyb
确认删除吗?[yes/no]no
谢谢你,再见

case写法:

[root@localhost ~] vim userdul.sh
#!/bin/bash
read -p "请您输入待删除的用户名:"  user
read -p "确认吗?[yes/no]"  action

case $action in
y|Y|yes|Yes|YES)
userdel -r "$user"
echo "$user 已经删除"
;;

*)
echo "谢谢你,再见"
;;
esac

[root@localhost ~] bash userdul.sh 
请您输入待删除的用户名:hyb
确认吗?[yes/no]Y
hyb 已经删除
案例2:jumpsever跳板服务器

需求:由于工作中,我么需要管理N多台服务器。那么访问服务器就是一件繁琐的事情。通过shell编程,编写跳板程序。当我们需要访问服务器时,看一眼服务器列表名,按一下数字,就登陆了。岂不是美哉。

跳板主机,运行跳板脚本。弹出数十台服务器名的菜单

1)mysql1

2)mysql2

3)bj-web1

h)help

q)exit

用户请选择要连接的主机[1:3]:1

last login:sun sep 6 04:18:01 2015 from 192.168.122.1

[root@localhost ~]$ 连接成功!!!

  • 定义跳转脚本
[root@localhost ~] vim /jiao_ben/jump.sh
#!/bin/bash
web1=192.168.18.167
web2=0.0.0.0
mysql=0.0.0.0
docer=0.0.0.0
k8s=0.0.0.0


#打印菜单
cat <<EOF
请选择需要登录的服务器序号:
1.登陆web1服务器
2.登陆web2服务器
3.登陆mysql服务器
4.登陆docker服务器
5.登陆k8s服务器
6.按任意键退出
EOF


#用户选择则服务器序号,收集变量用read
read -p "您选择的是:" num

#判断用户选择,登陆服务器
case  $num  in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$mysql
;;
4)
ssh root@$docker
;;
5)
ssh root@k8s
;;
*)
echo "谢谢再见"
exit
esac

[root@localhost ~] bash /jiao_ben/jump.sh 
请选择需要登录的服务器序号:
1.登陆web1服务器
2.登陆web2服务器
3.登陆mysql服务器
4.登陆docker服务器
5.登陆k8s服务器
6.按任意键退出
您选择的是:1
The authenticity of host '0.0.0.0 (0.0.0.0)' can't be established.
ECDSA key fingerprint is SHA256:4Ba1XKPia2De3/ptaSw3VMw43x1W6gFrim0JsIejHNc.
ECDSA key fingerprint is MD5:5f:d1:3f:78:6a:ad:fb:98:9f:de:a0:c3:d0:ac:7b:cf.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': 
Host key verification failed.
[root@localhost ~] vim /jiao_ben/jump.sh
[root@localhost ~] bash /jiao_ben/jump.sh 
请选择需要登录的服务器序号:
1.登陆web1服务器
2.登陆web2服务器
3.登陆mysql服务器
4.登陆docker服务器
5.登陆k8s服务器
6.按任意键退出
您选择的是:1
The authenticity of host '192.168.18.176 (192.168.18.176)' can't be established.
ECDSA key fingerprint is SHA256:4Ba1XKPia2De3/ptaSw3VMw43x1W6gFrim0JsIejHNc.
ECDSA key fingerprint is MD5:5f:d1:3f:78:6a:ad:fb:98:9f:de:a0:c3:d0:ac:7b:cf.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.18.176' (ECDSA) to the list of known hosts.
root@192.168.18.176's password: 
Last login: Sun Nov 13 17:38:24 2022
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt/cdrom 忙
       /dev/sr0 已经挂载到 /mnt/cdrom 上
我是system,下午好!金吉韩,这个世界由你掌控!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@何永斌@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值