动态

详情 返回 返回

Linux Bash 中 $? 的詳細用法 - 动态 详情

$?: The Heart of Error Handling in Bash Scripting

Bash (Bourne Again SHell) 是使用最廣泛的 SHell 腳本語言之一,因為它與 Unix 和 Linux 系統兼容。它提供了許多內置函數和變量,使腳本編寫更高效,更不容易出錯。其中一個變量是 $?, 它是 Bash 腳本錯誤處理的一個組成部分。這個特殊變量保存最後一個執行命令的退出狀態,這對於根據命令成功或失敗控制腳本流至關重要。

1. 理解退出狀態

在類 unix 操作系統中,理解退出狀態的概念是非常必要的。每當命令或程序完成執行時,它都會向 shell 發送一個退出狀態。這個退出狀態是一個整數,表示命令是否成功。

按照慣例,退出狀態為 0 表示成功,而任何非零值 (1-255) 表示錯誤。每個非零退出狀態可以對應於不同類型的錯誤,允許腳本根據遇到的特定錯誤採取各種糾正操作。

2. $? 的作用

$? 變量捕捉到了這種退出狀態。每次執行完命令後,可以通過 $? 獲取執行的狀態。

例如:我們想創建一個目錄,我們可以使用 $? 檢查目錄創建是否成功。

mkdir /path/to/directory
if [ $? -eq 0 ]
then
    echo "Directory was created successfully."
else
    echo "Failed to create the directory."
fi

3. 高級用法

退出狀態也可以直接在條件中使用,而不需要明確引用 $?,shell 允許使用邏輯操作符 && 和 || 將命令鏈接在一起。&& 操作符僅在前一個命令成功 (退出狀態為 0) 時運行下一個命令,而 || 操作符僅在前一個命令失敗(退出狀態非零) 時運行下一個命令。

下面我們使用這些操作符重寫前面的腳本:

mkdir /path/to/directory && echo "Directory was created successfully." || echo "Failed to create the directory."

這行代碼與前面的腳本相同,但更簡潔。

4. 在函數中使用退出狀態

正如命令和程序返回退出狀態一樣,bash 腳本中的函數也可以返回退出狀態,這進一步增加了 $? 的功能。當函數完成時,它可以返回退出狀態以指示成功或失敗,或者向腳本的其餘部分發出特定條件的信號。

下面是一個使用退出狀態的函數示例

function check_directory {
    if [ -d "$1" ]
    then
        return 0
    else
        return 1
    fi
}

check_directory /path/to/directory

if [ $? -eq 0 ]
then
    echo "Directory exists."
else
    echo "Directory does not exist."
fi

5. 根據特定的退出狀態執行操作

非零退出狀態可以提供有關所發生錯誤類型的詳細信息。例如,在某些命令中,退出狀態為 1 可能表示小問題,而退出狀態為 2 則表示嚴重錯誤。通過捕獲和處理這些特定的狀態,您的腳本可以以不同的方式處理不同的錯誤情況。

下面是如何使用特定退出狀態的簡單示例

command

case $? in
0)
    echo "Command succeeded."
;;
1)
    echo "Command failed due to minor problem."
;;
2)
    echo "Command failed due to severe problem."
;;
*)
    echo "An unknown error occurred."
;;
esac

6. 注意事項

(1) $? 只保存最後執行的命令的退出狀態。如果在檢查 $? 之前執行了其他命令,退出狀態將被覆蓋。

(2) 並非所有命令和程序都遵循“0為成功”和“非0為錯誤”的約定。有些可能使用不同的狀態碼,或者沒有準確地使用退出狀態。經常檢查您正在使用的命令的手冊頁或其他文檔,以瞭解不同的退出狀態代表什麼

我的開源項目

酷瓜雲課堂-開源知識付費解決方案

  • course-tencent-cloud(酷瓜雲課堂 - gitee倉庫)
  • course-tencent-cloud(酷瓜雲課堂 - github倉庫)
user avatar big_cat 头像 meiduyandechengzi 头像 yqyx36 头像 shuyixiaobututou 头像 congjunhua 头像 240cgxo4 头像 lanyiyun666 头像
点赞 7 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.