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> ... <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> 和 <code>$@</code></p>
<ul><li><strong>作用</strong>:获取所有参数。
<ul><li><code>$*</code>:所有参数合并成一个字符串(<code>"$1 $2 $3 ..."</code>)。</li><li><code>$@</code>:每个参数单独处理(<code>"$1" "$2" "$3" ...</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 &
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> 和 <code>$@</code>(在双引号中的区别)</p>
<ul><li>**<code>"$*"</code>**:所有参数合并成一个字符串(<code>"$1 $2 $3"</code>)。</li><li>**<code>"$@"</code>**:每个参数单独处理(<code>"$1" "$2" "$3"</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 脚本的编写效率! </p>
頁:
[1]