Shell脚本调试与错误处理详解

在 Shell 脚本中,set 命令用于控制脚本的执行行为和调试选项。以下是详细解释:

1. set -eset +e

  • set -e(严格错误检查)
    当命令返回非零退出状态(失败)时,立即退出脚本
    示例:

    set -e
    false  # 此命令失败,脚本立即终止
    echo "此行不会执行"
    
  • set +e(关闭错误检查)
    默认行为。即使命令失败,脚本也会继续执行。
    示例:

    set +e  # 默认状态,可省略
    false  # 此命令失败
    echo "此行会继续执行"  # 脚本继续运行
    

2. set -xset +x

  • set -x(调试模式)
    在执行命令前打印命令及其参数(变量已展开),便于调试。
    示例:

    set -x
    var="test"
    echo $var  # 输出: + echo test \n test
    
  • set +x(关闭调试)
    默认行为。不打印执行的命令。
    示例:

    set +x  # 关闭调试
    echo "正常输出"  # 仅输出内容,不显示命令
    

3. 默认行为

  • 如果不设置任何选项:
    • set +e:忽略错误,继续执行。
    • set +x:不打印执行的命令。
    • set +u:不检查未定义变量(使用空值替代)。
    • set -o pipefail 未启用:管道中仅最后一条命令的退出码决定整体状态。

4. 其他常用 set 选项

选项作用
set -u使用未定义的变量时报错并退出(避免空变量引发的错误)。
set +u允许使用未定义变量(默认行为)。
set -o pipefail管道中任意命令失败,整个管道返回非零状态(覆盖默认的最后一条命令决定行为)。
set -C禁止重定向覆盖文件(需用 `>
set -f禁用文件名通配(如 * 不被展开)。
set -v打印输入的命令(原始行,变量未展开)。

5. 典型用法示例

#!/bin/bash
# 常用安全设置:严格模式
set -euxo pipefailecho "示例开始"
cmd_that_might_fail || true  # 忽略特定错误
echo "示例结束"
  • -e:遇错退出。
  • -u:未定义变量报错。
  • -x:打印执行的命令。
  • -o pipefail:管道中任意命令失败则整体失败。

总结

选项作用默认
set -e遇错退出+e
set -x打印执行的命令(调试)+x
set -u未定义变量报错+u
set -o pipefail管道中任意失败则整体失败未启用

合理组合这些选项(如 set -euxo pipefail)可大幅提升脚本的健壮性和可维护性!


理解!记住这些参数的关键在于关联场景 + 简单口诀。我总结了一套记忆法,帮你彻底摆脱死记硬背:


🔧 终极记忆法(按使用频率排序)

选项暴力记忆法场景联想开关方向
-eerror 立即停错误退出 (Error Exit)- 启用
-xexecution 看得清调试打印 (eXecution trace)- 启用
-uundefined 要报错变量检查 (Undefined)- 启用
-o pipefail管道 全军覆没才算败管道严格检查- 启用

💡 开关方向统一规律
- 字母 = 启用严格模式 (如 -e, -x, -u)
+ 字母 = 关闭严格模式 (回到默认宽松状态)


🚀 高频组合拳(直接背这句)

# 安全脚本黄金搭档 - 放脚本开头
set -euxo pipefail

记忆口诀
👉 “euxo管饭” (想象欧洲人管饭很严格)
-e 遇错停 | -u 变量查 | -x 调试看 | -o pipefail 管道严


🔄 对照练习(用例子强化)

# 场景1:严格模式 (黄金搭档生效)
set -euxo pipefail
echo $UNDEF_VAR   # -u生效:未定义变量 → 报错退出
false             # -e生效:命令失败 → 立即退出# 场景2:关闭调试 (临时放松)
set +x            # 关闭命令打印
echo "安静模式..."# 场景3:忽略错误 (特定命令)
set +e            # 关闭-e
may_fail_command  # 即使失败也继续
set -e            # 恢复严格

🧠 记忆钩子(随时回忆)

  1. -e → 看到 e 就想到 Error → 必须退出
  2. -x → 像 X光 透视命令执行过程
  3. -uU = 变量未定义(Undefined)就报错
  4. 管道检查-o pipefail 中的 pipe 就是管道

✨ 进阶技巧

  1. 在终端临时启用

    # 当前会话全局生效(调试脚本超有用)
    $ set -x
    $ your_commands...
    $ set +x  # 关闭
    
  2. 查看所有set状态

    $ echo $-
    # 输出示例:himBHs  (包含的字母表示已启用选项)
    
  3. 推荐别名(加到 ~/.bashrc):

    alias debug='set -euxo pipefail'  # 一键严格模式
    alias undebug='set +eux'          # 一键关闭
    

终极心法
set -上锁(严格模式)
set +解锁(宽松模式)
字母只是锁的类型(e=错误锁, x=透视锁, u=变量锁)

按这个逻辑练习写两次脚本,就能形成条件反射啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88000.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鲲鹏服务器创建Zookeeper镜像实例

配置Kafka过程中,少不了要使用Zookeeer,这里记录一下配置Zookeeper镜像实例的过程。 创建目录 mkdir -p /data/docker/zookeeper/data mkdir -p /data/docker/zookeeper/conf mkdir -p /data/docker/zookeeper/logs说明:data目录为数据挂载…

GitHub Actions 自动 CI 测试 WorkFlow工作流搭建

大家好,我是此林。 代码托管平台 Github 我们应该比较熟悉。每次我们提交代码到 GitHub 仓库时,特别是开源项目,一般都会自动触发测试脚本运行,帮你验证代码没有引入新的错误。 这个其实就是 GitHub Actions,一般我们…

0-机器学习简介

有监督学习 目标:建立一个模型(函数),来描述输入(x)和输出(y)之间的映射关系。 价值:模型训练完成后,新的输入,模型会给出预测值输出。 注意点: 1.要有足够的训练样本 2.输入和输出之间有关联关系 3.输入…

前端跨域解决方案(6):Nginx

1 Nginx 核心 Nginx 是一个开源的高性能 HTTP 和反向代理服务器,以轻量级、高并发处理能力和低资源消耗著称。除作为 Web 服务器外,还可充当邮件代理服务器和通用的 TCP/UDP 代理服务器,广泛应用于现代 Web 架构中。 在 Windows 系统中使用…

C++智能指针编程实例

智能指针是C11引入的重要特性&#xff0c;用于自动管理动态分配的内存&#xff0c;防止内存泄漏。下面介绍几种高级智能指针编程实例。 1. 共享所有权模式 (shared_ptr) 循环引用问题及解决方案 #include <memory> #include <iostream>class B; // 前向声明clas…

单元测试总结

一、测试方案: 单元测试方案应包括以下步骤: 1.理解代码结构:仔细阅读代码,理解程序的结构、逻辑和算法。 2.制定测试目标:明确你想要测试的功能和输出结果; 3.撰写测试用例:编写涵盖所有测试目标的测试用例; 4.执行测试:运行测试用例以验证功能的正确性; 5.编写报告:根据测试…

Spring面向切面编程AOP(2)

前置通知&#xff08;Before Advice&#xff09; 前置通知在目标方法执行之前被调用&#xff0c;常用于执行一些预处理逻辑&#xff0c;例如权限验证、参数校验等。在 Spring 配置文件中&#xff0c;前置通知通过<aop:before>标签进行配置&#xff0c;以下是一个典型的示…

设备故障预测与健康管理技术:从数据到决策的工业智能进化之路​

在工业 4.0 与智能制造浪潮的推动下&#xff0c;设备故障预测与健康管理&#xff08;Prognostics and Health Management, PHM&#xff09;技术已成为企业实现数字化转型的核心驱动力。据统计&#xff0c;制造业中设备非计划停机 1 小时的平均损失高达 25 万美元&#xff0c;而…

RabbitMQ从入门到实践:消息队列核心原理与典型应用场景

在现代应用开发中&#xff0c;系统各部分之间的通信至关重要。这就是像RabbitMQ这样的消息代理发挥作用的地方。无论您是在构建微服务架构、实现任务队列&#xff0c;还是开发实时聊天应用程序&#xff0c;RabbitMQ都可能成为改变游戏规则的工具。本文将深入探讨RabbitMQ是什么…

基于Spring Boot和Vue的网上军事论坛设计与实现

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅Java开发语言3. ✅Redis数据库4. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理1.2 内容审核1.3 权限分配1.4 菜单管理1.5 字典管理 2. 用户…

LLMs基础学习(八)强化学习专题(6)

LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;6&#xff09; 文章目录 LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;6&#xff09;深度强化学习&#xff08;DQN&#xff09;DQN 起源&#xff1a;《Playing Atari with Deep Reinforceme…

JVM(10)——详解Parallel垃圾回收器

Parallel 垃圾回收器&#xff08;也称为 吞吐量优先收集器&#xff09;。它是 Java 早期&#xff08;特别是 JDK 8 及之前&#xff09;在多核处理器上的默认垃圾回收器&#xff0c;其核心设计目标是最大化应用程序的吞吐量。 一、Parallel 回收器的定位与设计目标 核心目标&am…

MySQL(91)什么是分布式数据库?

分布式数据库是一种将数据存储在多个物理位置的数据库系统。这些位置可能分布在不同的服务器、数据中心甚至地理位置。分布式数据库系统允许数据的存储、处理和访问分布在多个节点上&#xff0c;以提高数据的可用性、可靠性、可扩展性和性能。 1. 分布式数据库的特点 1.1 数据…

Java事务失效(面试题)的常见场景

1. 方法非public修饰 原理&#xff1a; Spring AOP代理&#xff08;CGLIB或JDK动态代理&#xff09;默认无法拦截非public方法。 示例&#xff1a; Service public class UserService {Transactionalvoid updateUser() { // 非public方法// 事务不会生效&#xff01;} } 修…

GitHub 趋势日报 (2025年06月20日)

&#x1f4ca; 由 TrendForge 系统生成* | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1810 data-engineer-handbook 373 n8n 295 anthropic-cookbook 291 automatisch…

qt常用控件--01

文章目录 qt常用控件--01上一篇文章的补充windowTitle属性windowIcon属性windowOpaCity属性cursor属性font属性结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c11中常见的新增表达 作…

C++ 中 string 类的解析及简易自我实现

目录 引言 标准库中的 string 类 功能概述 常见操作示例 自我实现简易 string 类 代码结构概述 1. String11.h 头文件 类的成员变量 迭代器相关 构造函数和析构函数 基本访问和修改方法 赋值运算符重载 内存管理和扩容 以下代码在.cpp文件中解析: 2. String11.…

计算机的性能指标(选择题0~1题无大题)

存储器的性能指标 总容量存储单元个数*存储字长 bit 例&#xff1a;MAR16位&#xff0c;MDR16位 总容量2的16次方*16bit 补充&#xff1a; n个二进制位就有2的n次方不同的状态 一般描述文件大小容量单位 2的10次方&#xff1a;K 2的20次方&#xff1a;M 2的…

React 核心原理与Fiber架构

目录 一、虚拟 DOM 二、Diffing 算法 三、Fiber 架构 四、渲染流程 1. Render 阶段&#xff08;可中断异步过程&#xff09; 2. Commit 阶段&#xff08;同步不可中断&#xff09; 五、时间切片&#xff08;Time Slicing&#xff09; 六、核心流程步骤总结 1. 状态更新…

【破局痛点,赋能未来】领码 SPARK:铸就企业业务永续进化的智慧引擎—— 深度剖析持续演进之道,引领数字化新范式

摘要 在瞬息万变的数字时代&#xff0c;企业对业务连续性、敏捷创新及高效运营的需求日益迫切。领码 SPARK 融合平台&#xff0c;秉持“持续演进”这一核心理念&#xff0c;以 iPaaS 与 aPaaS 为双擎驱动&#xff0c;深度融合元数据驱动、智能端口调度、自动化灰度切换、AI 智…