1. Shell条件语句基础与核心语法
在Shell脚本编程中,条件判断是构建逻辑流程的核心要素。作为一名有着十年运维经验的工程师,我发现很多新手在使用条件语句时容易犯一些基础错误。下面我将从实际工作场景出发,详细解析Shell条件语句的各类用法和避坑要点。
1.1 三种判断方式对比与选择
Shell提供了三种主要的条件判断语法形式,每种都有其适用场景:
bash复制# 传统test命令
test -e /etc/passwd
# 方括号简写形式(最常用)
[ -e /etc/passwd ]
# 双括号扩展语法(bash特有)
[[ -e /etc/passwd ]]
重要提示:使用
[ ]时,括号与内部表达式之间必须有空格,写成[-e file]会导致语法错误。这是新手最常见的错误之一。
在实际工程中,我建议:
- 简单脚本使用
[ ]保证兼容性 - 复杂逻辑使用
[[ ]]以获得更好的可读性和功能支持 - 避免使用原始的
test命令形式,可读性较差
1.2 文件测试操作符详解
文件判断是Shell脚本中最常用的条件判断类型。以下是经过多年实践总结的核心操作符:
bash复制# 存在性检查
[ -e "/path/to/file" ] # 文件或目录存在即为真
# 类型判断
[ -f "/path/to/file" ] # 是普通文件
[ -d "/path/to/dir" ] # 是目录
[ -L "/path/to/link" ] # 是符号链接
# 权限检查
[ -r "/path/to/file" ] # 可读
[ -w "/path/to/file" ] # 可写
[ -x "/path/to/file" ] # 可执行
# 特殊检查
[ -s "/path/to/file" ] # 文件大小非零
[ -N "/path/to/file" ] # 文件自上次读取后被修改过
实战经验:检查文件是否存在时,建议总是使用绝对路径。相对路径在脚本中可能因为工作目录变化导致判断失效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数值与字符串比较的陷阱与技巧
2.1 数值比较的正确姿势
Shell中数值比较必须使用专门的数值比较运算符,使用字符串比较运算符会导致意外结果:
bash复制a=10
b=20
# 正确方式(数值比较)
[ $a -eq $b ] # 等于
[ $a -ne $b ] # 不等于
[ $a -gt $b ] # 大于
[ $a -lt $b ] # 小于
[ $a -ge $b ] # 大于等于
[ $a -le $b ] # 小于等于
# 错误示范(字符串比较)
[ $a == $b ] # 可能产生意外结果
[ $a > $b ] # 按字典序比较,不是数值比较
避坑指南:比较前建议先验证变量是否为有效数字。可以使用正则表达式:
[[ $var =~ ^[0-9]+$ ]]
2.2 字符串比较的注意事项
字符串比较看似简单,但有几个关键细节需要注意:
bash复制str1="hello"
str2="world"
# 等于比较(=和==等价)
[ "$str1" = "$str2" ]
