shell中的判断语法

基本语法

1,

复制代码
test  条件表达式

2,注意:判断语句两边必须保留一个空格

复制代码
[ 条件表达式 ]

3,支持正则表达式,

注意:判断语句两边必须保留一个空格 注意:\[ 这个里面只能使用 \|\| 或者 \&\& 不能使用 -a 和 -o ]

复制代码
[[ 条件表达式 ]]

判断结果是真还是假,通过 $?来判断,如果结果是"0"那就是真,如果结果是"1"那就是假

文件存在与否判断

复制代码
#文件/目录 是否存在 exist
test -e 文件/目录的名字

#另一种写法
[ -e 文件/目录的名字 ]

#是否 是普通磁盘文件(文本、脚本等),目录、软链接不满足 file
test -f 文件的名字

#另一种写法
[ -f 文件名 ]

#是否是文件夹(目录)directory
test -d 目录的名字

#另一种写法
[ -d 目录名 ]

是文件或者目录吗?是 是普通的文件吗?是 是一个目录吗?不是

文件权限判断

当前用户对1文件有读取权限吗?有 当前用户对1文件有写入权限吗?有 当前用户对1文件有执行权限吗?没有

两个文件比较新旧

复制代码
test file1 -nt  file2        比较file1是否比file2新        
test file1 -ot  file2         比较file1是否比file2旧
test file1 -ef  file2        比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode

-nt:new than

-ot:old than

-ef:equal file 断两个文件inode 编号完全一致 → 是同一个物理文件(硬链接)返回真$?=0

硬链接 (hard link)

Linux 磁盘里:

  • inode 号:文件在磁盘的唯一身份证,保存文件大小、权限、磁盘块位置
  • 文件名:只是 inode 的别名、快捷入口

硬链接本质:多个不同文件名,共用同一个 inode 号

复制代码
# 创建硬链接:ln 源文件 硬链接名
ln file1.txt link1.txt

此时 file1.txt 和 link1.txt inode 一模一样

硬链接特点

1,删一个文件名,文件本体还在:inode 引用计数 - 1,计数 > 0 时数据不丢失

复制代码
# 只删文件名,link1还能正常读取内容
rm file1.txt 

2,不能跨分区 / 跨磁盘创建:不同磁盘 inode 编号独立,无法共用 inode

3,不能对目录创建硬链接(系统保护,防止目录循环死链)

  • 硬链接:同一个实体,多个名字,删名字不删数据
  • 软链接:快捷方式,存路径,删源文件快捷方式作废

大小比较符号

在 Shell 中,-eq、-ne、-gt、-lt、-ge 和 -le 用于数值比较。它们常用于测试两个数字是否相等、不等、大小关系等

复制代码
-eq        (equal)相等
-ne        (not euqal)不等
-gt        (greater than)大于
-lt        (litter than)小于
-ge        (greater equal)大于等于
-le        (litter equal)小于等于

字符串之间的判断

复制代码
-z         (zero)是否为空字符串              字符串长度为0,就成立
-n         (not zero)是否为非空字符串        只要字符串非空,就是成立

变量 = 变量2             是否相等
变量1 != 变量2           是否不等

-eq和=号的区别?

  • -eq:equal,整数专用比较符(只认数字)
  • =:没有英文缩写,就是字符串全等符号

read实现脚本交互式录入

从键盘接收用户输入,把输入内容存入变量,实现脚本交互式录入

-p 提示信息

-p "提示文字" 变量名

功能:输入前打印提示语句,不用额外echo,prompt提示、提示信息

复制代码
# 终端输出:我是 ,用户输入lulu → name=lulu
read -p "我是 " name

-r 原始读取

-r变量

功能:**禁止反斜杠\转义,原样保留输入的\ **raw(原始读取)

复制代码
#手动输入:\a\b\c
read -r a
\a\b\c
复制代码
#不加-r
read a
\a\b

-s静默模式

silent 静默(密码隐藏输入)

作用:敲键盘打字,屏幕完全不显示任何字符,专门用来输密码、密钥,防止旁边人偷看。

复制代码
#-s + -p 组合最常用
read -s -p "请输入密码:" pwd
  • -p:打印提示文字请输入密码:
  • -s:输入全程隐藏,看不见密码
  • 输完回车,密码存进变量pwd

逻辑判断符号

复制代码
 -a  和 &&     (and 逻辑与)        两个条件同时满足,整个大条件为真
 -o  和 ||     (or 逻辑或)         两个条件满足任意一个,整个大条件为真

&& 或者 || 有短路效应

&&:逻辑与(并且) ,前命令成功(返回0),才执行后面命令

||:逻辑或(或者) ,前命令失败(返回非 0),才执行后面命令

短路效应:只要左边就能确定整体结果,右边代码直接不执行(跳过)

&& 短路规则(全真才真,一假全假)

|| 短路规则(一真全真,全假才假)

复制代码
命令1 && 命令2

命令1 || 命令2
  • 如果命令 1 执行失败($?≠0):直接短路,命令 2 不运行(左边已经错了,整体必然错,没必要跑右边)
  • 只有命令 1 成功($?=0):才继续跑命令 2
  • 如果命令 1 执行成功($?=0):直接短路,命令 2 不运行(左边已经成功,整体结果一定成立,跳过右边)
  • 只有命令 1 失败($?≠0):才执行命令 2

注意:如果想一个中括号搞定,多个条件判断,那么使用-a/-o

如果想多个中括号搞定多个条件判断,那么使用 && / ||

-a = and → 逻辑与(并且,两个条件全都成立才为真)

-o = or → 逻辑或(或者,任意一个成立就为真)

复制代码
[ 条件1 -a 条件2 ] 

[ 条件1 -o 条件2 ]

#案例:-eq (equal等于) -ne (not equal 不等于)
[ 1 -eq 1 -a 1 -ne 0 ]  

普通命令:$?= 程序执行是否报错;[]判断命令:$?= 条件逻辑是否成立

⚠️ 禁忌:

单[]括号里面不能直接写 &&/||,会语法报错!

&& ||放在两个中括号的外侧,用来连接两个独立判断

✅ 同括号里用 -a/-o,括号之间用 &&/||

相关推荐
律宏阔4 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔4 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴4 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千5 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei375 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei375 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei375 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh5 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW5 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲5 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js