Shell 之 “&&“ 详解

在 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 表示失败(具体值因命令而异)。

&& 的行为基于退出状态码:

  1. 执行左侧命令。
  2. 如果左侧命令成功(状态码为 0),则执行右侧命令。
  3. 如果左侧失败(状态码非 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"

七、注意事项

  1. 空格问题
    Shell 对空格敏感,命令和参数之间必须有空格。

    # 正确写法
    [ -f "file.txt" ] && rm file.txt
    
    # 错误写法(缺少空格)
    [ -f"file.txt" ] && rm file.txt
    
  2. 组合条件时的括号
    使用 [ ][[ ]] 时,&& 会组合整个条件表达式。

    # 正确写法
    if [ "$var1" -gt 10 ] && [ "$var2" -lt 20 ]; then ...
    
    # 错误写法(缺少空格和括号)
    if [ "$var1" -gt 10 && "$var2" -lt 20 ]; then ...
    
  3. 优先级问题
    && 的优先级高于 ||,因此需要使用括号明确逻辑。

    # 正确写法(先执行 command1 && command2,再执行 command3)
    (command1 && command2) || command3
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值