shell判断
判断
条件判断语法格式(只作判断)
- 格式1: test 条件表达式
- 格式2: [ 条件表达式 ]
- 格式3: [[ 条件表达式 ]] 支持正则
注意,中括号两边都需要空格隔开;更详细的使用man test
看文档。
判断文件类型
判断参数 | 含义 |
---|---|
-e |
判断文件是否存在(任何类型文件) |
-f | 判断文件是否存在并且 是一个普通文件 |
-d | 判断文件是否存在并且是一个目录 |
-L | 判断文件是否存在并且是一个软连接文件 |
-b | 判断文件是否存在并且是一个块设备文件 |
-S | 判断文件是否存在并且是一个套接字文件 |
-c | 判断文件是否存在并且是一个字符设备文件 |
-p | 判断文件是否存在并且是一个命名管道文件 |
-s |
判断文件是否存在并且是一个非空文件(有内容) |
例子1
1 | 判断当前目录下有没有 file 这个文件 |
例子2
1 | ---判断是否有这个文件夹,并且输出提示 |
判断文件权限
判断参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
-u | 是否有suid,高级权限冒险位 |
-g | 是否sgid,高级权限强制位 |
-k | 是否有t位,高级权限粘滞位 |
判断文件新旧
说明:这里的新旧指的是文件的修改时间
。
判断参数 | 含义 |
---|---|
file1 -nt file2 | 比较file1是否比file2新 |
file1 -ot file2 | 比较file1是否比file2旧 |
file1 -ef file2 | 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode |
判断整数
判断参数 | 含义 |
---|---|
-eq | 相等 |
-ne | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
判断字符串
判断参数 | 含义 |
---|---|
-z | 判断是否为空 字符串,字符串长度为0则成立 |
-n | 判断是否为非空 字符串,字符串长度不为0则成立 |
string1 = string2 | 判断字符串是否相等 |
string1 != string2 | 判断字符串是否相不等 |
多重条件判断
判断符号 | 含义 | 举例 |
---|---|---|
-a 和 && | 逻辑与 (and) | [ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ] |
-o 和 || | 逻辑或 (or) | [ 1 -eq 1 -o 1 -ne 1 ] |
特别说明:
&& 前面的表达式为真
,才会执行后面的代码
|| 前面的表达式为假
,才会执行后面的代码
; 只用于分割命令或表达式
举例说明
- 数值比较
1 | [root@server ~]# [ $(id -u) -eq 0 ] && echo "the user is admin" |
- 类C风格的数值比较
1 | 注意:在(( ))中,=表示赋值;==表示判断 |
- 字符串比较
1 | 注意:双引号引起来,看作一个整体;= 和 == 在 [ 字符串 ] 比较中都表示判断 |
逻辑运算符总结
- 符号;和&&和||都可以用来分割命令或者表达式
- 分号(;)完全不考虑前面的语句是否正确执行,都会执行;号后面的内容
&&
符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然||
符号,需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后内容;反之亦然- 如果&&和||一起出现,从左往右依次看,按照以上原则
流程控制语句
if结构
F:表示false,为假;T:表示true,为真
1 | if [ condition ];then |
if…else结构
1 | if [ condition ];then |
if…elif…else结构
1 | if [ condition1 ];then |
例子,案例1
判断两台主机是否ping通
思路
- 使用哪个命令实现
ping -c次数
- 根据命令的==执行结果状态==来判断是否通
$?
- 根据逻辑和语法结构来编写脚本(条件判断或者流程控制)
实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#!/bin/env bash
# 该脚本用于判断当前主机是否和远程指定主机互通
# 交互式定义变量,让用户自己决定ping哪个主机
read -p "请输入你要ping的主机的IP:" ip
# 使用ping程序判断主机是否互通
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "当前主机和远程主机$ip是互通的"
else
echo "当前主机和远程主机$ip不通的"
fi
# 逻辑运算符
# test $? -eq 0 && echo "当前主机和远程主机$ip是互通的" || echo "当前主机和远程主机$ip不通的"例子,案例2
判断一个进程是否存在
思路
- 查看进程的相关命令 ps pgrep
- 根据命令的返回状态值来判断进程是否存在
- 根据逻辑用脚本语言实现
落地实现
1 | #!/bin/env bash |
补充命令
1 | pgrep命令:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id |
例子,案例3
需求:判断门户网站是否能够正常访问
思路
- 可以判断进程是否存在,用/etc/init.d/httpd status判断状态等方法
- 最好的方法是 直接去访问 一下,通过访问成功和失败的返回值来判断
- Linux环境,wget curl elinks -dump
实现
1 | #!/bin/env bash |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 食葫芦的葫芦娃!
评论