Linux条件判断(全)

时间:2025-02-24 07:21:24

1、语法形式(三种)。

  • test 表达式
    案例演示:
[root@docker01 ~]# test 1 -eq 1
[root@docker01 ~]# echo $?
0
[root@docker01 ~]# test 1 -eq 11
[root@docker01 ~]# echo $?
1
  • [ 表达式 ]
    案例演示:
[root@docker01 ~]# [ 1 -eq 1 ]
[root@docker01 ~]# echo $?
0
[root@docker01 ~]# [ 2 -eq 1 ]
[root@docker01 ~]# echo $?
1
  • [[ 表达式 ]]
    案例演示:
[root@docker01 ~]# [[ 1 -eq 1 ]]
[root@docker01 ~]# echo $?
0
[root@docker01 ~]# [[ 1 -eq 112 ]]
[root@docker01 ~]# echo $?
1

注意:上面三种方式,效果等价。
[] 和 [[]] 的区别在于
单个 [ ] 使用字符串对字符串必须加双引号
两个 [[ ]] 不用对字符串变量加双引号
两个 [[ ]] 里面可以使用 &&,||, 而单个不行
两个 [[ ]] 支持c风格
两个 [[ ]] 支持正则

  • 类C风格的数值比较
    整数比较:
注意:在(( ))中,=表示赋值;==表示判断
[root@server ~]# ((1==2));echo $?
[root@server ~]# ((1<2));echo $?
[root@server ~]# ((2>=1));echo $?
[root@server ~]# ((2!=1));echo $?
[root@server ~]# ((`id -u`==0));echo $?
 
[root@server ~]# ((a=123));echo $a
[root@server ~]# unset a
[root@server ~]# ((a==123));echo $?

2、使用判断的常用场景。

  • 整数判断
    常用参数:
判断参数 含义
-eq == 相等
-ne <> != 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
  • 字符串判断
    常用参数:
判断参数 含义
-z 判断是否为空字符串,字符串长度为0则成立
-n 判断是否为非空字符串,字符串长度不为0则成立
string1 = string2 判断字符串是否相等
string1 != string2 判断字符串是否相不等
  • 文件类型判断
    常用参数:
判断参数 含义 说明
-e 判断文件是否存在(link文件指向的也必须存在) exists
-f 判断文件是否存在并且是一个普通文件 file
-d 判断文件是否存在并且是一个目录 directory
-L 判断文件是否存在并且是一个软连接文件 soft link
-b 判断文件是否存在并且是一个块设备文件 block
-S 判断文件是否存在并且是一个套接字文件 socket
-c 判断文件是否存在并且是一个字符设备文件 char
-p 判断文件是否存在并且是一个命名管道文件 pipe
-s 判断文件是否存在并且是一个非空文件(有内容) is not empty
  • 文件内容是否为空的判断
    常用参数:
判断参数 含义 说明
-s 判断文件是否存在并且是一个非空文件(有内容) is not empty
  • 文件权限判断
    常用参数:
判断参数 含义
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid,高级权限冒险位
-g 是否sgid,高级权限强制位
-k 是否有t位,高级权限粘滞位 (创建者/root才能删除)
  • 文件新旧判断
    常用参数:
    说明:这里的新旧指的是文件的修改时间。
判断参数 含义
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode

3、简单应用。

#!/bin/env bash
#该脚本用于判断输入的网站是否能够正常提供服务。

read -p "请输入网址:" addr;
wget -T 2 -t 2 -P ./tmp_files $addr &>/dev/null;
if [ $? -eq 0 ];then
	echo	"网址[$addr]可以正常访问";
	rm -f ./tmp_files/index.*
else
	echo	"网址[$addr]不可以访问";
fi

补充:

if中使用判断,还有个缺省模式,不使用test、[]、[[]]
可以直接对命令的执行结果进行判断。

if ls ;then echo 1111; fi;