当前位置: 首页 > news >正文

bash中||与的区别

在 Bash 中,||&& 是两种常用的逻辑操作符,用于控制命令的执行流程。它们的核心区别如下:


1. ||(逻辑 OR)

  • 作用:如果前一个命令失败(返回非零退出码),则执行后一个命令。
  • 记忆口诀|| 像"否则"(前面的失败了,就执行后面的)。
  • 示例
    [ -d "/backup" ] || mkdir -p "/backup"
    
    • 如果 /backup 不存在[ -d ] 返回非零),则执行 mkdir -p
    • 如果 /backup 已存在[ -d ] 返回零),跳过 mkdir

2. &&(逻辑 AND)

  • 作用:如果前一个命令成功(返回零退出码),则执行后一个命令。
  • 记忆口诀&& 像"而且"(前面的成功了,才执行后面的)。
  • 示例
    [ -f "/data/file.txt" ] && rm "/data/file.txt"
    
    • 如果 /data/file.txt 存在[ -f ] 返回零),则删除它。
    • 如果文件不存在[ -f ] 返回非零),跳过 rm

对比表格

操作符名称执行条件典型用途类比编程语言
``逻辑 OR前一个命令失败时执行
&&逻辑 AND前一个命令成功时执行条件执行、链式操作if (cmd)

实际应用场景

场景 1:依赖前序命令成功
# 只有 cd 成功时,才执行后续操作
cd "/project" && ./build.sh
场景 2:错误恢复
# 如果 ping 失败,尝试 curl 检测网络
ping -c1 google.com || curl -s ifconfig.me
场景 3:组合使用
# 如果目录不存在则创建,且只有创建成功时才写入文件
[ -d "/log" ] || mkdir "/log" && echo "Log started" >> "/log/app.log"

注意事项

  1. 退出码决定流程

    • 命令的退出码 0 表示成功,非 0 表示失败。
    • 可通过 $? 查看上一个命令的退出码:
      ls /nonexistent
      echo $?  # 输出 2(表示失败)
      
  2. ; 的区别

    • cmd1 ; cmd2:无论 cmd1 是否成功,都会执行 cmd2
    • cmd1 && cmd2:只有 cmd1 成功时才执行 cmd2
  3. 避免过度嵌套

    # 难以阅读的写法
    [ -f file ] && grep "pattern" file || echo "Not found"# 更清晰的写法
    if [ -f file ]; thengrep "pattern" file
    elseecho "Not found"
    fi
    

经典用例

1. 快速条件判断
# 只有是 root 用户时才执行操作
[ "$(id -u)" -eq 0 ] && echo "Running as root" || echo "Need root"
2. 链式检查
# 检查依赖命令是否存在
command -v git &>/dev/null && \command -v docker &>/dev/null && \echo "All dependencies installed" || \echo "Missing dependencies"
3. 错误处理
# 如果备份失败,记录日志并退出
tar -czf backup.tar.gz /data || {echo "[ERROR] Backup failed" >> /var/log/backup.logexit 1
}

掌握 ||&& 的区别后,可以显著提升脚本的简洁性和健壮性。

http://www.lryc.cn/news/585054.html

相关文章:

  • consul 的安装与服务发现
  • Python PDFplumber详解:从入门到精通的PDF处理指南
  • Java 深入解析:JVM对象创建与内存机制全景图
  • mysql中的自增ID
  • k8s-高级调度(一)
  • cefSharp.WinForms.NETCore 138.xx (cef138/Chromium 138.0.7204.97) 升级测试体验
  • 《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》
  • tcp/quic 的滑动窗口
  • 基于ASP.NET+SQL Server实现(Web)企业进销存管理系统
  • 虹科分享 | 告别实体钥匙!数字钥匙正在重构你的用车体验
  • 大模型及agent开发6 OpenAI Assistant API 高阶应用 - 流式输出功能
  • 【Kubernetes】Ubuntu 24.04 安装 K3s v1.33.2+k3s
  • 上半年净利预增66%-97%,高增长的赛力斯该咋看?
  • windows配置python环境
  • 【面板数据】省级泰尔指数及城乡收入差距测算(1990-2024年)
  • MySQL 的语言体系
  • Tomasulo算法是什么?
  • PCB 层压板各向异性:对高级过孔建模的影响
  • AMTS AHTE | 具身智能成制造升级新引擎 灵途科技助力更强感知
  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • MDSE模型驱动的软件工程和敏捷开发相结合的案例
  • 淘宝拍立淘接口技术解析:从原理到实践‌
  • 1.1.2 运算符与表达式——AI教你学Django
  • [WinForms] 如何为 .NET Framework 4.8 窗体程序添加自定义图标
  • 多租户架构下的多线程处理实践指南
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_max
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_buckets
  • 番外-linux系统运行.net framework 4.0的项目
  • 如何在报表开发工具FastReport .NET 中构建和连接 Firebird 插件?
  • 基于ASP.NET MVC+SQLite开发的一套(Web)图书管理系统