Linux Shell 基础之条件判断语句

Shell 条件判断式语句

按文件类型判断

测试选项 作用
-b 文件 判断该文件是否存在,并且是否为块设备文件
-c 文件 判断该文件是否存在,并且是否为字符设备文件
-d 文件 判断该文件是否存在,并且是否为目录文件
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件
-L 文件 判断该文件是否存在,并且是否为符号链接文件
-p 文件 判断该文件是否存在,并且是否为管道文件
-s 文件 判断该文件是否存在,并且是否为非空
-S 文件 判断该文件是否存在,并且是否为套接字文件

两种判断格式

  • test -e /root/install.log
  • [ -e /root/install.log ]
  • [ -e /root/install.log ] && echo yes || echo no

按文件权限判断

测试选项 作用
-r 文件 判断该文件是否存在,并且是否该文件拥有读权限
-w 文件 判断该文件是否存在,并且是否该文件拥有写权限
-x 文件 判断该文件是否存在,并且是否该文件拥有执行权限
-u 文件 判断该文件是否存在,并且是否该文件拥有 SUID 权限
-g 文件 判断该文件是否存在,并且是否该文件拥有 SGID 权限
-k 文件 判断该文件是否存在,并且是否该文件拥有 SBit 权限

两个文件之间的比较

测试选项 作用
文件1 -nt 文件2 判断文件 1 的修改时间是否比文件 2 的新
文件1 -ot 文件2 判断文件 1 的修改时间是否比文件 2 的旧
文件1 -ef 文件2 判断文件 1 是否和文件 2 的 Inode 号一致,可以理解为两个文件是否为同一个文件,这个判断用于硬链接判断是很好的方法

例子

1
2
3
4
5
# 创建一个硬链接
ln /root/student.txt/tmp/stu.txt
# 测试
[/root/student.txt -ef /tmp/stu.txt] && echo "yes" || echo "no"

两个整数之间的比较

测试选项 作用
整数1 -eq 整数2 判断整数 1 是否和整数 2 相等
整数1 -ne 整数2 判断整数 1 是否和整数 2 不相等
整数1 -gt 整数2 判断整数 1 是否大于整数 2
整数1 -lt 整数2 判断整数 1 是否小于整数 2
整数1 -ge 整数2 判断整数 1 是否大于等于整数 2
整数1 -le 整数2 判断整数 1 是否小于等于整数 2

例子

1
2
[ 23 -ge 22 ] && echo "yes" || echo "no"
[ 23 -le 22 ] && echo "yes" || echo "no"

字符串的判断

测试选项 作用
-z 判断字符串是否为空
-n 判断字符串是否为非空
字符串1==字符串2 判断字符串 1 是否和字符串 2 相等
字符串1!=字符串2 判断字符串 1 是否和字符串 2 不相等

例子

1
2
3
4
5
6
7
8
9
10
11
12
# 给 name 变量赋值
name=fengj
# 判断 name 变量是否为空
[ -z "$name" ] && echo "yes" || echo "no"
# 给变量 aa 和变量 bb 赋值
aa=11
bb=22
# 判断两个变量的值是否相等
[ "$aa" == "$bb" ] && echo yes || echo no

多重条件判断

测试选项 作用
判断1 -a 判断2 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真
判断1 -o 判断2 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真
! 判断 逻辑非,使原始的判断式取反

例子

1
2
3
4
5
# 给变量 aa 赋值
aa=11
# 判断变量 aa 是否有值,同时判断变量 aa 是否大于 23
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"

Shell 单分支if语句

概述

如何 “背” 程序

  1. 抄写目标程序并能正确运行
  2. 为目标程序补全注释
  3. 删掉注释,为代码重新加注释
  4. 删除代码,看注释写代码
  5. 删除注释和代码,从头开始写

单分支 if 语句

语法支持

1
2
3
4
5
6
7
8
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
fi

例子1:判断登录的用户是否为 root

1
2
3
4
5
6
7
8
#!/bin/bash
test=$(env|grep "USER" |cut -d "=" -f2)
if [ "$test" == root ]
then
echo "Current user is root."
fi

单分支 if 语句例子:判断分区使用率

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 统计根分区使用率,把根分区使用率作为变量值赋予变量 rate
rate=$(df -h | grep "/dev/disk1" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 70 ]
then
echo "Warning! /dev/disk1 is full!!"
fi

Shell 双分支if语句

语法支持

1
2
3
4
5
6
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi

双分支 if 语句例子:判断输入的是否是一个目录

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
read -t 30 -p "Please input a dir:" dir
if [ -d "$dir" ]
then
echo "is a Dir"
else
echo "is not a Dir"
fi

双分支 if 语句例子:判断Apache服务是否启动

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 列出所有进程,选取 httpd 进程,反选 grep
test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
then
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
sudo apachectl restart &> /dev/null
echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi

Shell 多分支 if 语句

语言支持:

1
2
3
4
5
6
7
8
9
if [ 条件判断式 1 ]
then
条件成立 1 时,执行的程序
elif [ 条件判断式 2 ]
then
条件成立 2 时,执行的程序
else
条件不成立时,执行的另一个程序
fi

多分支 if 语句例子:判断用户输入的是什么文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# 判断用户输出的是什么文件
# 接受键盘的输入,并赋予变量file
read -p "Please input a filename:" file
# 判断变量是否为空
if [ -z "$file" ]
then
echo "Error,Please input a filename"
exit 1
# 判断 file 的值是否存在
elif [ ! -e "$file" ]
then
echo "Your input is not a file!"
exit 2
# 判断 file 的值是否为普通文件
elif [ -f "$file" ]
then
echo "$file is a regulare file!"
# 判断 file 的值是否为目录文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"

Shell 多分支case语句

语法支持

1
2
3
4
5
6
7
8
9
10
case $变量名 in
"值1")
如果变量的值等于值 1,则执行程序1
;;
"值2")
如果变量的值等于值 2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;