Linux Shell编程及自动化运维实现 第2章 判断

前言

无论什么编程语言都离不开条件判断(流控)。SHELL也不例外。
例如,用户输入的密码不够长时提示用户,你太短了
例如,用户输入了备份的目录,如果有目录继续备份,如果没有目录创建目录。
例如,用户输入成绩,如果100-80分评为优秀,如果60-79分评为合格,如果59-0分评为不合格。

Shell 条件测试

格式

格式1: test 条件表达式
在这里插入图片描述在这里插入图片描述

格式2: [ 条件表达式 ]
注:中括号用空格分隔区别在这里插入图片描述在这里插入图片描述

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

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

在这里插入图片描述

$?上一个结果的返回值
0表示正确
非0表示错误

-f filename : 当filename 存在时返回真
-b filename : 当filename 存在并且是块文件时返回真(返回0)
-d pathname : 当pathname 存在并且是一个目录时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-u pathname : 当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
-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 的用户的用户组时返回真
file1 -nt file2 : file1 比file2 新时返回真
file1 -ot file2 : file1 比file2 旧时返回真

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

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

在这里插入图片描述在这里插入图片描述

C语言风格(了解)
[root@localhost ~]# ((1<2));echo $?
0
[root@localhost ~]# ((1>2));echo $?
1
[root@localhost ~]# ((1>=2));echo $?
1
[root@localhost ~]# ((1<=2));echo $?
0
[root@localhost ~]# ((1!=2));echo $?
0
[root@localhost ~]# ((id -u>0));echo $?
1

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

=,==,等于
猜测你的用户名是root
[ "$USER" = "root" ];echo $?
0
 [ "$USER" == "root" ];echo $?
0

在这里插入图片描述
注意区分大小写

>!=,不等于
[root@localhost ~]# [ "$USER" = "root" ];echo $?
0
[root@localhost ~]# [ "$USER" = "alice" ];echo $?
1
[root@localhost ~]# [ "$USER" != "alice" ];echo $?
0

在这里插入图片描述
取反

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

双引号的重要性
定义三个变量,一个有值,一个妹纸,一个没有定义。
[root@localhost ~]# var1=111
[root@localhost ~]# var2=
 //var3变量没有定义

-z:判断长度是0
[root@localhost ~]# [ -z "$var1" ];echo $?
1
[root@localhost ~]# [ -z "$var2" ];echo $?
0
[root@localhost ~]# [ -z "$var3" ];echo $?
0
-n:判断长度不是0
[root@localhost ~]# [ -n "$var1" ];echo $?
0
[root@localhost ~]# [ -n "$var2" ];echo $?
1
[root@localhost ~]# [ -n "$var3" ];echo $?
1

或者
	[root@localhost ~]# echo ${#var1}
3
[root@localhost ~]# echo ${#var2}
0
[root@localhost ~]# echo ${#var3}
0

and 和 or

逻辑的(and)与(or)

&& 逻辑的 AND 的意思, -a 也是这个意思,两个条件同时成立,为真。

|| 逻辑的 OR 的意思, -o 也是这个意思,两个条件一个成立,为真。

[root@localhost ~]# num=59;[ $num -gt 60 -a $num -lt 80 ];echo $?
1
[root@localhost ~]# num=81;[ $num -gt 60 -a $num -lt 80 ];echo $?
1
[root@localhost ~]# num=60;[ $num -gt 60 -a $num -lt 80 ];echo $?
1
[root@localhost ~]# num=61;[ $num -gt 60 -a $num -lt 80 ];echo $?
0

流程控制 if

单分支结构

语法
单分支结构
if 条件测试
then 命令序列
fi

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

多分支结构(if else)

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

不做测试

多分支结构 (if elif else)

语法
多分支结构
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 is night 

在这里插入图片描述在这里插入图片描述

嵌套结构

语法
嵌套结构
if 条件测试1	then 命令序列
if 条件测试1	then 命令序列

else 命令序列
fi

else 命令序列
fi

需求

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

模式匹配:case

case 语法结构
ase 语法结构(字符串比较)
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
esac

案例1:简单的模式匹配
邀请用户输入待删除用户名。
询问用户,确定要继续删除吗 yes/no: " y

if写法

#!/bin/bash
#name
#time
#1请输入删除的用户名:
read -p "please input a username : " user
#2输出用户ID
id $user &> /dev/null
#4判断用户是否存在
if [ $? -ne 0 ];then
    echo "no such user:  $user"
    exit 1
fi
#3请用户确认是否删除
read -p "are you sure?[y/n]: " action
if [ "$action" = "y" -o "$action" = "Y" ] ;then
    userdel -r $user
    echo "$user is deleted!"
else
    echo "thank you"
fi

在这里插入图片描述在这里插入图片描述

case写法

#!/bin/bash
#name
#time
#1请输入删除的用户名:
read -p "please input a username : " user
#2输出用户ID
id $user &> /dev/null
#4判断用户是否存在
if [ $? -ne 0 ];then
    echo "no such user:  $user"
    exit 1
fi
#3请用户确认是否删除
read -p "are you sure?[y/n]: " action
#if [ "$action" = "y" -o "$action" = "Y" ] ;then
#       userdel -r $user
#       echo "$user is deleted!"
#else
#       echo "thank you"
#fi

#5case写法
case "$action" in
Y|y|YES|yes)
userdel -r $user
echo "$user is deleted!"
;;
*)
echo "thank you"
;;
esac

在这里插入图片描述在这里插入图片描述


案例:系统管理工具箱

Command action
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序

Command (h for help): m
total used free shared buffers cached
Mem: 7628 840 6788 0 29 378
Swap: 2047 0 2047

#!/usr/bin/bash
#打印菜单
cat <<-EOF
h. help
f. disk partation
d. filesystem mount
m. memory
u. system load
q.exit
EOF

# 读取用户输入,进行模式匹配

read -p "please input [h for help]: " action
case "$action" in

f)
	fdisk -l
	;;
d)
	df -hT
	;;
m)
	free -m
;;
u)
	uptime
;;
q)
	exit
;;

*)
	echo "error"
esac

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值