Liunx shell编程及自动化运维实现--第二章判断

本文详细介绍了Shell编程中的条件测试(包括数值、文件、字符串比较)、流程控制结构(if、elif、else、case等)以及调试技巧。通过实例展示了如何使用这些技术来验证用户输入、管理文件和执行系统任务。
摘要由CSDN通过智能技术生成

一、Shell条件测试

1.数值比较[整数1  操作符  整数2]

操作符

-gt大于
-lt小于
-eq等于
-ne不等于
-ge大于等于
-le小于等于

echo  ${#pass}        变量长度

测试语法  必须有空格

        1.test条件表达式        test 2 -ge 7 | echo $?

        2.[条件表达式]           [ 2 -ge 7  ] | echo $?

        3.[[条件表达式]]         [[  2 -ge 7  ]]  | echo $?

if语法结构

        if  如果

        then  那么

        else   否则

        fi  结束

实例

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

2.脚本

vim   pass.sh

read  -p  "请输入您的密码,是否满足长度“  ps

if  [  ${#ps}   -lt    7  ]

then

echo "您的密码太短"

else

echo "您的密码太长"

fi

3,测试  bash  pass.sh

2.文件测试[操作符  文件或目录]

操作符

-f filename当filename 存在时返回真
-b  filename当filename存在并且是块文件时返回真(返回0)
-d pathname当pathname存在并且是一个目录时返回真
-h filename当filename存在并且是符号链接文件时返回真 或  - Lfilename
-c filename当filename存在并且是字符文件时返回真
-e pathname当由pathname指定的文件或目录存在时返回真
-g pathname当由pathname指定的文件或目录存在并且设置了SGID 位时返回真:
-k pathname当由pathname指定的文件或目录存在并且设置了粘滞位时返回真
-p filename当filename存在并且是命名管道时返回真
-r pathname当由pathname 指定的文件或目录存在并且可读时返回真
-s filename当filename存在并目文件大小大于0时返回真
-S filename当filename存在并且是socket时返回真
-t  fd当fd 是与终端设备相关联的文件描述符时返回真
-W pathname当由pathname 指定的文件或目录存在并且可写时返回真
-X  pathname当由pathname指定的文件或目录存在并日可执行时返回真
-O pathname当由pathname存在并且被当前进程的有效用户id的用户拥有时返回真(字母O大写)
-G pathname当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真

实例

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

2.脚本

vim   path.sh

#!/bin/bash

read  -p  "请输入您要备份的目录:"  dir1

if  [  -d  $dir1  ]

then  echo  "$dir1存在可以备份"

else  echo  "$dir1不存在不可以备份"

fi

或  test  -d  /abc  ; echo  $?

3.测试

chmod  +x  /path.sh

bash   path.sh

3.字符串比较[“字符串”=“字符串”]

3.1 =  等于

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

脚本:

read  -p  "您确定要升级这件装备吗?"  select

if  [  "$select" = "yes"  ]        必须有双引号

then  echo  "装备升级开始。。”

else  echo  "感谢您欢迎下次光临”

fi

3.2  !=  不等于

read  -p  "您确定要升级这件装备吗?"  select

if  [  "$select" != "yes"  ]        必须有双引号

then  echo  "感谢您欢迎下次光临”

else  echo  "装备升级开始。。”

fi

3.3  -z   -n

-z  判断字符长度是否为0

bbb=""

echo ${#bbb}  |  echo $?

-n  判断字符长度不是为0

[  -n  "$bbb"  ]   ;  echo  $? 

4.and和or

当条件测试比较复杂时,需要多个条件同时成立,就需要混合测试——>and和or

&&  逻辑and的意思   -a,两个条件同时成立为真

||     逻辑 or的意思     -o,两个条件一个成立为真

需求:用户输入的密码必须满足以下条件

        1.长度大于等于7

        2.包含小写字母

        3.包含大写

        4.包含符号“@_!

read  -p  "请您输入密码:"  pass

if  [  ${#pass} -ge  7 ]    &&    [[  ${pass} =~  [a-z]   ]]  &&  [[  ${pass} =~  [A-Z]  ]] &&  [[  ${pass} =~  [@_!]  ]]

then  echo  "sucess”

else  echo  "error”

fi

~  模糊查询  用的时候必须要加[[

[[ 2 -le 5  -a  9  -le  8]]

[[ 2 -le 5  -o  9  -le  8]]

[[ 2 -le 5  &&  9  -le  8]]

[[ 2 -le 5  || 9  -le  8]]

二、流程控制if

1.单分支结构

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

fi

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

read  -p  ”请输入用户名:“  name

id $name &> /dev/null

if  [ $? -ne 0   ]

then  useradd  $name

fi

2.双分支结构

if  条件测试

then

命令序列

else

命令序列

fi

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

read  -p  ”请输入用户名:“  name

if  id $name &> /dev/null

then echo "用户已经存在"

else  useradd $name and  echo "用户已经创建"

fi

3.多分支结构

if  条件测试

then 命令序列

elif 条件测试

then 命令序列

elif 条件测试

then 命令序列

elif 条件测试

then 命令序列

...................

else

命令序列

fi

案例:编写脚本:取出系统时间,并对数字进行判断6-10morning 11-13 noon  14-18afternoon  其他night

hour=`date +%H`                                  date后有空格,没有报错,取时针的数
echo $hour
if [ $hour -ge 6 -a  $hour -le 10 ]
        then
                 echo "it is moring"
        elif [ $hour -ge 11 -a  $hour -le 13 ]
                then    echo "it is noon"
        elif [ $hour -ge 14 -a  $hour -le 18 ]
                then echo "it is afternoon"
        else
                echo "it is night"
fi

4.嵌套结构

if  条件测试  then 命令序列

        if  条件测试  then 命令序列

        else  命令序列

                fi

else     命令序列

fi

需求:

#!/bin/bash
read -p "input  username:" name
if id $name &> /dev/null
        then
        echo "$name exit"
        else
        useradd $name
        echo "$name create finished"

        read -p "please input user password :" pass
                if [ ${#pass} -ge  7 ]
                        then echo "$pass" | passwd --stdin $name     #--stdin从标准输入读取令牌(只有根用户才能进行此操作)
                             echo "$name user password $pass"
                        else echo "password not good"
                fi
fi

5.调试脚本

调试脚本的其他方法

sh  -n  02.sh         仅调试脚本中的语法错误

sh  -vx  02.sh        以调试的方法执行,查询整个执行过程

6.注意

  1. []表示条件测试,注意这里的空格,要注意在“[后边”和“]”前边都必须有空格
  2. 在shell里,then和fi是分开的语句,如果在同一行输入,则需要用分号将他们隔开
  3. 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[-n "$var"],如果var为空会出错
  4. 判断是不支持浮点数的,
  5. 如果只单独使用>或者<,系统会认为时输入或输出重定向,虽然结果显示正确,但其实是错误的,因此要对这些符号进行转意
  6. 默认,运行if语句中的命令,所产生的错误信息,仍然出现在脚本的输出结果中
  7. 使用-z或者-n来检查长度时,没有定义的变量也为0
  8. 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试前使用-n,或-z测试一下
  9. $?变量包含了之前执行命令的退出状态(最近完成的前台进程,可用于检测退出状态)

三、模式匹配:case

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

1.案例1

简单的模式匹配:邀请用户输入带删除的用户名,询问用户,确实要继续删除吗yes/no

if写法

#!/bin/bash
read -p "input delete userName:" name
read -p "select isnot delete user(yes or no):" select
if [[  "$select" =  "yes" ]]
        then userdel $name;echo "delete $name success"
        elif [[  "$select" =  "no" ]]
        then echo "no delete $name"
        else echo  "erorr select"
fi

case语法结构

case  变量 in

        模式1)

        命令序列1

        模式2)

        命令序列2

        模式3)

        命令序列3

*)

无匹配命令后序列

        esac

userdel -r "$name"
echo "delete user success";;
*)
echo "thank you";;
esac

2.案例2:简单的jumpServer

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

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

#!/bin/bash
web1=192.168.64.2
web2=192.168.64.3
mysql1=192.168.64.4
docker=192.168.64.5
k8s=192.168.64.6

#dayincaidan
cat <<EOF
please select login service number:
1.login web1 service
2.login web2 service
3.login mysql service
4.login docker service
5.login k8s service
6.renyijian exit
EOF
read -p "please select service number:" num
case $num  in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;; 
3) 
ssh root@$mysql1 
;; 
4) 
ssh root@$docker 
;; 
5) 
ssh root@$k8s 
;; 
*) 
echo "thank you" 
exit 
esac

3.案例3:系统管理工具箱

前言:Liunx提供的丰富的管理命令,用户管理,内存管理,磁盘管理,进程管理,日志管理,文件管理,软件管理,网络管理等等数十个工具包。如果你能通过shell编程,把他们编到一个程序中,想用某些功能,只需要按回车,就能完成,岂不美哉。

#!/bin/bash
cat <<EOF 
please select use tool: 
h.help information 
f.disk information 
d.file system mount info 
m.neicun info 
u.system fuzai info 
y.guazaidianxinxi 
q.exit tool box 
EOF 
 
read -p "please input select tool number:" num 
case $num in 
h) 
echo "qingshuruzimujinrugongjuxiang,ru:shuru "f" chakancipanxinxi" 
;; 
f) 
fdisk -l 
;; 
d) 
mount -a 
;; 
m) 
free -m
;;
u)
uptime
;;
y)
df -hT
echo "----------------------------------"
        read -p "chaxun guazai dian xinxi,chakan dulifenqu ,an Y tuichu:" select 
        if [ -n $select ] 
        then 
                df -hT | grep $select 
        fi 
;; 
q) 
echo "thank you" 
exit 
;; 
esac

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值