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.txtlink1.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和=号的区别?

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

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,括号之间用 &&/||

相关推荐
iDao技术魔方2 小时前
WSL 配 GPU 用 Docker 的折腾指南(2026 年版)
运维·docker·容器
2601_950368912 小时前
稀土合金粉末采购指南:3步筛选靠谱镁钆供应商
大数据·运维·人工智能·python
mifengxing2 小时前
操作系统(五)
linux·运维·服务器·操作系统·王道考研
土星云SaturnCloud2 小时前
边缘计算赋能烟草行业数字化转型
服务器·人工智能·ai·边缘计算
跳动的世界线2 小时前
WSL 2 + Docker 本地全栈开发环境配置指南
运维·docker·容器
算力视野2 小时前
GPU、NPU、TPU有什么区别?
服务器·人工智能·gpu算力
ALINX技术博客2 小时前
【黑金云课堂】FPGA技术教程Linux开发:NVMe/Qt/OpenCV人脸检测
linux·qt·fpga开发
We Just Keep growing2 小时前
【MySQL运维篇】——日志、主从复制、分库分表、读写分离
java·运维·数据库·windows·学习·mysql
change_fate2 小时前
ERR_PNPM_WORKSPACE_PKG_NOT_FOUND In ...
java·服务器·前端