当不公发生在谁身上 發表於 2025-6-17 11:07:12

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">​总结​</a></li></ul></div><p>在 Bash 脚本和命令行中,​<strong>特殊变量</strong>​(Special Variables)主要用于获取脚本或命令的上下文信息,如参数、进程状态、返回值等。以下是常见的特殊变量及其典型应用场景:</p>
<p class="maodian"><a name="_label0"></a></p><h2>​1. 脚本参数处理​</h2>
<p><code>$0</code>、<code>$1</code>、<code>$2</code>&nbsp;...&nbsp;<code>$9</code>、<code>${10}</code>...</p>
<ul><li>​<strong>作用</strong>​:获取脚本或函数的参数。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;"># script.sh
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"</pre></div>
<p>​<strong>运行示例</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">./script.sh hello world</pre></div>
<p>​<strong>输出</strong>​:</p>
<blockquote><p>脚本名称: ./script.sh<br />第一个参数: hello<br />第二个参数: world</p></blockquote>
<p><code>$#</code></p>
<ul><li>​<strong>作用</strong>​:获取传递给脚本或函数的参数个数。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">if [ $# -eq 0 ]; then
    echo "错误:请提供参数!"
    exit 1
fi</pre></div>
<p><code>$*</code>&nbsp;和&nbsp;<code>$@</code></p>
<ul><li>​<strong>作用</strong>​:获取所有参数。
<ul><li><code>$*</code>:所有参数合并成一个字符串(<code>&quot;$1 $2 $3 ...&quot;</code>)。</li><li><code>$@</code>:每个参数单独处理(<code>&quot;$1&quot; &quot;$2&quot; &quot;$3&quot; ...</code>),适用于循环遍历。</li></ul></li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">for arg in "$@"; do
    echo "参数: $arg"
done</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>​2. 进程和返回值​</h2>
<p><code>$$</code></p>
<ul><li>​<strong>作用</strong>​:获取当前 Shell 或脚本的 ​<strong>PID(进程 ID)​</strong>。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">echo "当前进程 ID: $$"</pre></div>
<p>​<strong>输出</strong>​:</p>
<blockquote><p>当前进程 ID: 12345</p></blockquote>
<p><code>$?</code></p>
<ul><li>​<strong>作用</strong>​:获取 ​<strong>上一条命令的退出状态码</strong>​(0 表示成功,非 0 表示失败)。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">grep "keyword" file.txt
if [ $? -ne 0 ]; then
    echo "未找到 keyword!"
fi</pre></div>
<p>或者:</p>
<div class="jb51code"><pre class="brush:bash;">command || echo "命令执行失败!"</pre></div>
<p><code>$!</code></p>
<ul><li>​<strong>作用</strong>​:获取 ​<strong>最后一个后台运行的进程 PID</strong>。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">sleep 10 &amp;
echo "后台进程 PID: $!"</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>​3. 脚本自身信息​</h2>
<p><code>$0</code></p>
<ul><li>​<strong>作用</strong>​:获取 ​<strong>脚本名称或 Shell 名称</strong>。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">echo "当前脚本: $0"</pre></div>
<p>​<strong>输出</strong>​:</p>
<blockquote><p>当前脚本: ./test.sh</p></blockquote>
<p><code>$_</code></p>
<ul><li>​<strong>作用</strong>​:获取 ​<strong>上一个命令的最后一个参数</strong>。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">ls /usr/bin
echo "上一个命令的最后一个参数: $_"</pre></div>
<p>​<strong>输出</strong>​:</p>
<blockquote><p>/usr/bin<br />上一个命令的最后一个参数: /usr/bin</p></blockquote>
<p class="maodian"><a name="_label3"></a></p><h2>​4. 通配符和扩展​</h2>
<p><code>$*</code>&nbsp;和&nbsp;<code>$@</code>(在双引号中的区别)</p>
<ul><li>​**<code>&quot;$*&quot;</code>**​:所有参数合并成一个字符串(<code>&quot;$1 $2 $3&quot;</code>)。</li><li>​**<code>&quot;$@&quot;</code>**​:每个参数单独处理(<code>&quot;$1&quot; &quot;$2&quot; &quot;$3&quot;</code>),适用于循环遍历。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">for arg in "$@"; do
    echo "参数: $arg"
done</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>​5. 其他特殊变量​</h2>
<p><code>$RANDOM</code></p>
<ul><li>​<strong>作用</strong>​:生成 ​<strong>随机数(0-32767)​</strong>。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">echo "随机数: $RANDOM"</pre></div>
<p><code>$SECONDS</code></p>
<ul><li>​<strong>作用</strong>​:获取 ​<strong>脚本运行时间(秒)​</strong>。</li></ul>
<p>​<strong>典型用途</strong>​:</p>
<div class="jb51code"><pre class="brush:bash;">sleep 3
echo "运行时间: $SECONDS 秒"</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>​总结​</h2>
<table><tbody><tr><th>变量</th><th>作用</th><th>典型用途</th></tr><tr><td><code>$0</code></td><td>脚本名称</td><td>获取当前脚本名</td></tr><tr><td><code>$1</code>-<code>$9</code></td><td>脚本参数</td><td>处理命令行参数</td></tr><tr><td><code>$#</code></td><td>参数个数</td><td>检查参数数量</td></tr><tr><td><code>$*</code></td><td>所有参数(合并)</td><td>整体处理参数</td></tr><tr><td><code>$@</code></td><td>所有参数(独立)</td><td>循环遍历参数</td></tr><tr><td><code>$?</code></td><td>上一条命令的返回值</td><td>检查命令是否成功</td></tr><tr><td><code>$$</code></td><td>当前进程 PID</td><td>记录进程 ID</td></tr><tr><td><code>$!</code></td><td>最后一个后台进程 PID</td><td>管理后台任务</td></tr><tr><td><code>$_</code></td><td>上一个命令的最后一个参数</td><td>快速引用参数</td></tr><tr><td><code>$RANDOM</code></td><td>随机数</td><td>生成随机值</td></tr><tr><td><code>$SECONDS</code></td><td>脚本运行时间</td><td>计时</td></tr></tbody></table>
<p>这些特殊变量在 ​<strong>脚本参数处理、错误检查、进程管理、日志记录</strong>​ 等场景中非常有用,熟练掌握它们可以大幅提升 Bash 脚本的编写效率!&nbsp;</p>
頁: [1]
查看完整版本: Bash 脚本中的特殊变量及应用场景详解