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
英文地址,請注明出處:http://en.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 智…