日光菩萨 發表於 2025-5-27 09:21:58

Linux Bash 中 $? 的详细用法实例小结

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 理解退出状态</a></li><li><a href="#_label1">2. $? 的作用</a></li><li><a href="#_label2">3. 高级用法</a></li><li><a href="#_label3">4. 在函数中使用退出状态</a></li><li><a href="#_label4">5. 根据特定的退出状态执行操作</a></li><li><a href="#_label5">6. 注意事项</a></li></ul></div><p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202505/202505270915547.jpeg" /></p>
<p>Bash (Bourne Again SHell) 是使用最广泛的 SHell 脚本语言之一,因为它与 Unix 和 Linux 系统兼容。它提供了许多内置函数和变量,使脚本编写更高效,更不容易出错。其中一个变量是 <code>$?</code>, 它是 Bash 脚本错误处理的一个组成部分。这个特殊变量保存最后一个执行命令的退出状态,这对于根据命令成功或失败控制脚本流至关重要。</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 理解退出状态</h2>
<p>在类 unix 操作系统中,理解退出状态的概念是非常必要的。每当命令或程序完成执行时,它都会向 shell 发送一个退出状态。这个退出状态是一个整数,表示命令是否成功。</p>
<p>按照惯例,退出状态为 0 表示成功,而任何非零值 (1-255) 表示错误。每个非零退出状态可以对应于不同类型的错误,允许脚本根据遇到的特定错误采取各种纠正操作。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2. $? 的作用</h2>
<p><code>$?</code> 变量捕捉到了这种退出状态。每次执行完命令后,可以通过 <code>$?</code> 获取执行的状态。</p>
<p>例如:我们想创建一个目录,我们可以使用 <code>$?</code> 检查目录创建是否成功。</p>
<div class="jb51code"><pre class="brush:bash;">mkdir /path/to/directory
if [ $? -eq 0 ]
then
    echo "Directory was created successfully."
else
    echo "Failed to create the directory."
fi</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 高级用法</h2>
<p>退出状态也可以直接在条件中使用,而不需要明确引用 <code>$?</code>,shell 允许使用逻辑操作符 &amp;&amp; 和 || 将命令链接在一起。&amp;&amp; 操作符仅在前一个命令成功 (退出状态为 0) 时运行下一个命令,而 || 操作符仅在前一个命令失败(退出状态非零) 时运行下一个命令。</p>
<p>下面我们使用这些操作符重写前面的脚本:</p>
<div class="jb51code"><pre class="brush:bash;">mkdir /path/to/directory &amp;&amp; echo "Directory was created successfully." || echo "Failed to create the directory."</pre></div>
<p>这行代码与前面的脚本相同,但更简洁。</p>
<p class="maodian"><a name="_label3"></a></p><h2>4. 在函数中使用退出状态</h2>
<p>正如命令和程序返回退出状态一样,bash 脚本中的函数也可以返回退出状态,这进一步增加了 <code>$?</code> 的功能。当函数完成时,它可以返回退出状态以指示成功或失败,或者向脚本的其余部分发出特定条件的信号。</p>
<p>下面是一个使用退出状态的函数示例</p>
<div class="jb51code"><pre class="brush: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</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>5. 根据特定的退出状态执行操作</h2>
<p>非零退出状态可以提供有关所发生错误类型的详细信息。例如,在某些命令中,退出状态为 1 可能表示小问题,而退出状态为 2 则表示严重错误。通过捕获和处理这些特定的状态,您的脚本可以以不同的方式处理不同的错误情况。</p>
<p>下面是如何使用特定退出状态的简单示例</p>
<div class="jb51code"><pre class="brush:bash;">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</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>6. 注意事项</h2>
<p>(1) <code>$?</code> 只保存最后执行的命令的退出状态。如果在检查 <code>$?</code> 之前执行了其他命令,退出状态将被覆盖。</p>
<p>(2) 并非所有命令和程序都遵循&ldquo;0为成功&rdquo;和&ldquo;非0为错误&rdquo;的约定。有些可能使用不同的状态码,或者没有准确地使用退出状态。经常检查您正在使用的命令的手册页或其他文档,以了解不同的退出状态代表什么</p>
頁: [1]
查看完整版本: Linux Bash 中 $? 的详细用法实例小结