文章目录
前言
之前对shell脚本的基础理念进行了了解,但是那种简单的编写明显达不到自动化的需求,所以这次就在上一章的基础上进行学习关于语句的用法
一、条件测试操作
1.test测试
要使 Shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作。
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具——test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。
语法格式:
格式1:test条件表达式
格式2:[ 条件表达式 ]
2.文件测试
文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。
文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。
-d:测试是否为目录 (Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read) 。
-w:测试当前用户是否有权限写入(write) 。
-x:测试是否设置有可执行(Excute)权限。
-b:测试是否为设备文件
-c:测试是否为字符设备文件
-s:测试存在且文件大小为空
-L:测试是否为链接文件
执行条件测试操作以后,通过预定义变量 $?
可以获得测试命令的返回状态值,从而判断该条件是否成立。
执行以下操作可测试目录/media/是否存在,如果返回值$?为0,表示存在此目录,否则表示不存在或者虽然存在但不是目录
[root@localhost ~]# test -d /etc/sysconfig/ #测试是否为目录
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e /etc/sysconfig/ #测试目录或文件是否存在
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -f /etc/sysconfig/ #测试是否为文件
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /etc/sysconfig ] && echo "是目录" #&&表示逻辑与,“而且”的意思
是目录
[root@localhost ~]# echo $?
0
3.整数值比较
整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。
整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整数之间。
常用测试操作符
-eq | 第一个数等于(Equal)第二个数 |
---|---|
-ne | 第一个数不等于(Not Equal)第二个数 |
-gt | 第一个数大于(Greater Than)第二个数 |
-lt | 第一个数小于(Lesser Than)第二个数 |
-le | 第一个数小于或等于(Lesser or Equal)第二个数 |
-ge | 第一个数大于或等于(Greater or Equal)第二个数 |
[root@localhost ~]# who | wc -l
2
[root@localhost ~]# test $(who | wc -l) -le 5 "用户过少"
-bash: test: 参数太多
[root@localhost ~]# [ $(who | wc -l) -le 5 ] && echo "用户过少"
用户过少
4.字符串比较
格式1:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:
[ -z 字符串 ]
= | 字符串内容相同 |
---|---|
!= | 字符串内容不同,!号表示相反的意思 |
-z | 字符串内容为空字符 |
-n | 检查是否为空字符 |
5.逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2: 命令1 操作符 命令2
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "not en.US" #测试当前语言环境
not en.US
[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
二、if语句
1.单分支结构
单分支结构
if 条件测试操作
then 命令序列1
fi
例:
[root@localhost ~]# vim li1.sh
#!/bin/bash
if ls -l /home
then
echo "以上为home目录下的所有信息"
fi
[root@localhost ~]# vim li2.sh
#!/bin/bash
M="/mnt/centos7"
if [ ! -d $M ]
then
mkdir -p $M
echo "$M 已存在"
fi
[root@localhost ~]# sh li2.sh
/mnt/centos7 已存在
[root@localhost ~]# vim li3.sh
#!/bin/bash
read -p "请输入文件名:" file
if [[ $file = *.sh ]] #这里两个中括号是因为需要识别*,否则单个中括号无法识别
then
echo "这是shell脚本"
fi
2.双分支结构
if 条件测试操作
then 命令序列1
else 命令序列2
fi
例:
[root@localhost ~]# vim li4.sh
#!/bin/bash
IP=192.168.9.131
ping -c 3 -i 0.5 -w 3 $IP &> /dev/null #ping3次,每0.5秒一次,3秒后结束
if [ $? -eq 0 ]
then
echo "$IP is up"
else
echo "$IP is down"
fi
[root@localhost ~]# chmod +x li4.sh
[root@localhost ~]# sh li4.sh
192.168.9.131 is up
[root@localhost ~]# vim li5.sh
#!/bin/bash
if [ $UID -eq 0 ]
then
echo "当前用户为root"
else
echo "当前用户不是root"
fi
[root@localhost ~]# sh li5.sh
当前用户为root
[root@localhost home]# vim httpd1.sh
#!/bin/bash
pgrep aux | grep httpd | grep -v grep
if [ $? -ne 0 ]
then
if [ "$(rpm -q httpd)"=="未安装软件包 httpd" ]
then
yum install httpd -y
systemctl start httpd
echo "网站服务已安装启动"
else
systemctl start httpd
echo "网站服务已启动"
fi
else
echo "网站服务运行中"
fi
3.if多分支结构
多分支结构
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
else
命令序列3
fi
[root@localhost home]# vim test1.sh
#!/bin/bash
read -p "请输入你的考试分数(0-100):" GRADE
if [ $GRADE -eq 100 ];then
echo "$GRADE 分:满分"
elif [[ $GRADE -le 99 && $GRADE -ge 90 ]];then
echo "$GRADE 分:抄错题10遍"
elif [[ $GRADE -le 89 && $GRADE -ge 80 ]];then
echo "$GRADE 分:抄错题20遍"
elif [[ $GRADE -le 79 && $GRADE -ge 60 ]];then
echo "$GRADE 分:抄错题30遍"
elif [[ $GRADE -le 59 && $GRADE -ge 0 ]];then
echo "$GRADE 分:全抄30遍"
else
echo "$GRADE :输入错误,请重输"
fi
[root@localhost home]# chmod +x test1.sh
[root@localhost home]# sh test1.sh
请输入你的考试分数(0-100):99
99 分:抄错题10遍
三、case语句
case多分支结构
case 变量值 in
模式1)
命令序列1
;;
模式2)
;;
......
*)
默认命令序列
esac
[root@localhost home]# vim test2.sh
#!/bin/bash
read -p "请输入月份:" season
[ $season -ge 1 -a $season -le 3 ] && a=0
[ $season -ge 4 -a $season -le 6 ] && a=1
[ $season -ge 7 -a $season -le 9 ] && a=2
[ $season -ge 10 -a $season -le 12 ] && a=3
case $a in
0)
echo "春季"
;;
1)
echo "夏季"
;;
2)
echo "秋季"
;;
3)
echo "冬季"
;;
*)
echo "输入有误"
esac
[root@localhost home]# chmod +x test2.sh
[root@localhost home]# sh test2.sh
请输入月份:3
春季