在 Shell 脚本中,&&
是一个 逻辑与(AND)运算符,用于组合多个命令或条件表达式。它的核心作用是:只有当左侧的命令或条件为真(成功执行)时,才会执行右侧的命令或条件。如果左侧失败,右侧将不会执行。
一、基本语法
command1 && command2
1. 命令组合
- 如果
command1
成功(退出状态码为 0),则执行command2
。 - 如果
command1
失败(退出状态码非 0),则直接跳过command2
。
示例:
# 如果文件存在,则删除它
[ -f "file.txt" ] && rm file.txt
2. 条件判断
在 if
语句中,&&
用于组合多个条件,要求所有条件都为真时才执行后续操作。
if [ "$var1" -gt 10 ] && [ "$var2" -lt 20 ]; then
echo "条件成立"
fi
二、工作原理
Shell 中的每个命令执行后都会返回一个 退出状态码(exit code):
- 0 表示成功。
- 非 0 表示失败(具体值因命令而异)。
&&
的行为基于退出状态码:
- 执行左侧命令。
- 如果左侧命令成功(状态码为 0),则执行右侧命令。
- 如果左侧失败(状态码非 0),则直接跳过右侧命令。
三、典型应用场景
1. 依赖性操作
确保前一步操作成功后再执行后续操作,避免因失败导致错误累积。
# 创建目录并进入(如果创建失败则不会进入)
mkdir mydir && cd mydir
2. 简化条件判断
替代冗长的嵌套 if
语句,使代码更简洁。
# 检查文件是否存在且可读
[ -f "data.txt" ] && [ -r "data.txt" ] && echo "文件存在且可读"
3. 自动化脚本
在自动化流程中,确保每一步的成功后再继续下一步。
# 安装依赖包并运行程序
apt-get update && apt-get install -y nginx && systemctl start nginx
四、与其他运算符的区别
运算符 | 功能 | 行为 |
---|---|---|
&& | 逻辑与 | 左侧成功时执行右侧 |
` | ` | |
; | 顺序执行 | 无论左侧是否成功,均执行右侧 |
示例对比:
# 只有成功时才执行
command1 && command2
# 失败时执行
command1 || command2
# 无论成功与否都执行
command1; command2
五、高级用法
1. 与 ||
结合使用
&&
和 ||
可以组合实现更复杂的逻辑。
# 如果命令1成功,执行命令2;否则执行命令3
command1 && command2 || command3
2. 在函数中使用
在函数中使用 &&
可以控制流程。
my_function() {
step1 && step2 && step3
}
3. 与 set -e
结合
在脚本开头添加 set -e
,可以使脚本在任意命令失败时立即退出。
#!/bin/bash
set -e
step1 && step2 # 如果 step1 失败,脚本会直接退出,不会执行后续命令
六、常见问题解答
Q1: 如何判断多个条件是否都为真?
A: 使用 &&
组合条件。
if [ "$a" -gt 5 ] && [ "$b" -lt 10 ]; then ...
Q2: 如何确保命令链中某一步失败时跳过后续操作?
A: 使用 &&
连接命令链。
mkdir mydir && cd mydir && touch file.txt
Q3: 如何在一行中执行多个命令?
A: 使用 &&
或 ;
。
echo "Start"; sleep 1 && echo "Success"
七、注意事项
-
空格问题
Shell 对空格敏感,命令和参数之间必须有空格。# 正确写法 [ -f "file.txt" ] && rm file.txt # 错误写法(缺少空格) [ -f"file.txt" ] && rm file.txt
-
组合条件时的括号
使用[ ]
或[[ ]]
时,&&
会组合整个条件表达式。# 正确写法 if [ "$var1" -gt 10 ] && [ "$var2" -lt 20 ]; then ... # 错误写法(缺少空格和括号) if [ "$var1" -gt 10 && "$var2" -lt 20 ]; then ...
-
优先级问题
&&
的优先级高于||
,因此需要使用括号明确逻辑。# 正确写法(先执行 command1 && command2,再执行 command3) (command1 && command2) || command3