<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>pemako.cn Blog</title>
        <link>https://pemako.github.io/blog</link>
        <description>pemako.cn Blog</description>
        <lastBuildDate>Fri, 17 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[数学公式示例]]></title>
            <link>https://pemako.github.io/blog/2026/04/17/math</link>
            <guid>https://pemako.github.io/blog/2026/04/17/math</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[使用原生 Markdown 语法渲染数学公式，无需 shortcode。]]></description>
            <content:encoded><![CDATA[<p>使用原生 Markdown 语法渲染数学公式，无需 shortcode。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="行内公式">行内公式<a href="https://pemako.github.io/blog/2026/04/17/math#%E8%A1%8C%E5%86%85%E5%85%AC%E5%BC%8F" class="hash-link" aria-label="行内公式的直接链接" title="行内公式的直接链接" translate="no">​</a></h2>
<p>爱因斯坦质能方程：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo>=</mo><mi>m</mi><msup><mi>c</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">E = mc^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0576em">E</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.8141em"></span><span class="mord mathnormal">m</span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></p>
<p>欧拉公式：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>e</mi><mrow><mi>i</mi><mi>π</mi></mrow></msup><mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">e^{i\pi} + 1 = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.908em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8247em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">iπ</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">0</span></span></span></span></p>
<p>二次方程求根：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mstyle scriptlevel="0" displaystyle="true"><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.2764em;vertical-align:-0.686em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5904em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal">a</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">−</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">±</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9134em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord" style="padding-left:0.833em"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord">4</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span></span></span><span style="top:-2.8734em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1266em"><span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="块级公式">块级公式<a href="https://pemako.github.io/blog/2026/04/17/math#%E5%9D%97%E7%BA%A7%E5%85%AC%E5%BC%8F" class="hash-link" aria-label="块级公式的直接链接" title="块级公式的直接链接" translate="no">​</a></h2>
<p>傅里叶变换：</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∫</mo><mrow><mo>−</mo><mi mathvariant="normal">∞</mi></mrow><mi mathvariant="normal">∞</mi></msubsup><mover accent="true"><mi>f</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>ξ</mi><mo stretchy="false">)</mo><mtext> </mtext><msup><mi>e</mi><mrow><mn>2</mn><mi>π</mi><mi>i</mi><mi>ξ</mi><mi>x</mi></mrow></msup><mtext> </mtext><mi>d</mi><mi>ξ</mi></mrow><annotation encoding="application/x-tex">f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.3846em;vertical-align:-0.9703em"></span><span class="mop"><span class="mop op-symbol large-op" style="margin-right:0.4445em;position:relative;top:-0.0011em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4143em"><span style="top:-1.7881em;margin-left:-0.4445em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">∞</span></span></span></span><span style="top:-3.8129em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">∞</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9703em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9579em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0833em"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.046em">ξ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em"><span style="top:-3.113em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.0359em">π</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight" style="margin-right:0.046em">ξ</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.046em">ξ</span></span></span></span></span>
<p>正态分布：</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mrow><mi>σ</mi><msqrt><mrow><mn>2</mn><mi>π</mi></mrow></msqrt></mrow></mfrac><msup><mi>e</mi><mrow><mo>−</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><msup><mrow><mo fence="true">(</mo><mfrac><mrow><mi>x</mi><mo>−</mo><mi>μ</mi></mrow><mi>σ</mi></mfrac><mo fence="true">)</mo></mrow><mn>2</mn></msup></mrow></msup></mrow><annotation encoding="application/x-tex">f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.2514em;vertical-align:-0.93em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em"><span style="top:-2.2028em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">σ</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9072em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord" style="padding-left:0.833em"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.0359em">π</span></span></span><span style="top:-2.8672em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1328em"><span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.1857em"><span style="top:-3.413em;margin-right:0.05em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8443em"><span style="top:-2.656em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.2255em"><span class="pstrut" style="height:3em"></span><span class="frac-line mtight" style="border-bottom-width:0.049em"></span></span><span style="top:-3.384em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="minner mtight"><span class="minner mtight"><span class="mopen sizing reset-size3 size6 mtight delimcenter" style="top:0.075em"><span class="mtight">(</span></span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.879em"><span style="top:-2.656em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">σ</span></span></span></span><span style="top:-3.2255em"><span class="pstrut" style="height:3em"></span><span class="frac-line mtight" style="border-bottom-width:0.049em"></span></span><span style="top:-3.4624em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">μ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mclose sizing reset-size3 size6 mtight delimcenter" style="top:0.075em"><span class="mtight">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.1039em"><span style="top:-3.1436em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<p>矩阵：</p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mo fence="true">(</mo><mtable rowspacing="0.16em" columnalign="center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>a</mi></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>b</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>c</mi></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>d</mi></mstyle></mtd></mtr></mtable><mo fence="true">)</mo></mrow><mrow><mo fence="true">(</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>x</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>y</mi></mstyle></mtd></mtr></mtable><mo fence="true">)</mo></mrow><mo>=</mo><mrow><mo fence="true">(</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>a</mi><mi>x</mi><mo>+</mo><mi>b</mi><mi>y</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>c</mi><mi>x</mi><mo>+</mo><mi>d</mi><mi>y</mi></mrow></mstyle></mtd></mtr></mtable><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">\begin{pmatrix} a &amp; b \\ c &amp; d \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} ax + by \\ cx + dy \end{pmatrix}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">a</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">b</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">x</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size3">)</span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">a</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord mathnormal">b</span><span class="mord mathnormal" style="margin-right:0.0359em">y</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">c</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.0359em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size3">)</span></span></span></span></span></span></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="公式推导">公式推导<a href="https://pemako.github.io/blog/2026/04/17/math#%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC" class="hash-link" aria-label="公式推导的直接链接" title="公式推导的直接链接" translate="no">​</a></h2>
<div class="theme-tabs-container tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">傅里叶变换推导</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">正态分布参数说明</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>傅里叶变换将时域信号转换为频域：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∫</mo><mrow><mo>−</mo><mi mathvariant="normal">∞</mi></mrow><mi mathvariant="normal">∞</mi></msubsup><mover accent="true"><mi>f</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>ξ</mi><mo stretchy="false">)</mo><mtext> </mtext><msup><mi>e</mi><mrow><mn>2</mn><mi>π</mi><mi>i</mi><mi>ξ</mi><mi>x</mi></mrow></msup><mtext> </mtext><mi>d</mi><mi>ξ</mi></mrow><annotation encoding="application/x-tex">f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.372em;vertical-align:-0.4142em"></span><span class="mop"><span class="mop op-symbol small-op" style="margin-right:0.1945em;position:relative;top:-0.0006em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8593em"><span style="top:-2.3442em;margin-left:-0.1945em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">∞</span></span></span></span><span style="top:-3.2579em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">∞</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4142em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9579em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0833em"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.046em">ξ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.0359em">π</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight" style="margin-right:0.046em">ξ</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">d</span><span class="mord mathnormal" style="margin-right:0.046em">ξ</span></span></span></span></p><p>其逆变换为：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>f</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>ξ</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∫</mo><mrow><mo>−</mo><mi mathvariant="normal">∞</mi></mrow><mi mathvariant="normal">∞</mi></msubsup><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mtext> </mtext><msup><mi>e</mi><mrow><mo>−</mo><mn>2</mn><mi>π</mi><mi>i</mi><mi>ξ</mi><mi>x</mi></mrow></msup><mtext> </mtext><mi>d</mi><mi>x</mi></mrow><annotation encoding="application/x-tex">\hat f(\xi) = \int_{-\infty}^\infty f(x)\,e^{-2 \pi i \xi x}\,dx</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2079em;vertical-align:-0.25em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9579em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0833em"><span class="mord">^</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.046em">ξ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.2734em;vertical-align:-0.4142em"></span><span class="mop"><span class="mop op-symbol small-op" style="margin-right:0.1945em;position:relative;top:-0.0006em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8593em"><span style="top:-2.3442em;margin-left:-0.1945em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">∞</span></span></span></span><span style="top:-3.2579em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">∞</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4142em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.0359em">π</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight" style="margin-right:0.046em">ξ</span><span class="mord mathnormal mtight">x</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">d</span><span class="mord mathnormal">x</span></span></span></span></p><p>两者互为一对，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ξ</mi></mrow><annotation encoding="application/x-tex">\xi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal" style="margin-right:0.046em">ξ</span></span></span></span> 表示频率变量。</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mrow><mi>σ</mi><msqrt><mrow><mn>2</mn><mi>π</mi></mrow></msqrt></mrow></mfrac><msup><mi>e</mi><mrow><mo>−</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><msup><mrow><mo fence="true">(</mo><mfrac><mrow><mi>x</mi><mo>−</mo><mi>μ</mi></mrow><mi>σ</mi></mfrac><mo fence="true">)</mo></mrow><mn>2</mn></msup></mrow></msup></mrow><annotation encoding="application/x-tex">f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{1}{2}\left(\frac{x-\mu}{\sigma}\right)^2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.1076em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.721em;vertical-align:-0.538em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em"><span style="top:-2.551em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">σ</span><span class="mord sqrt mtight"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9128em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mtight" style="padding-left:0.833em"><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.0359em">π</span></span></span><span style="top:-2.8728em"><span class="pstrut" style="height:3em"></span><span class="hide-tail mtight" style="min-width:0.853em;height:1.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1272em"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.394em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.538em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.183em"><span style="top:-3.4103em;margin-right:0.05em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8443em"><span style="top:-2.656em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.2255em"><span class="pstrut" style="height:3em"></span><span class="frac-line mtight" style="border-bottom-width:0.049em"></span></span><span style="top:-3.384em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="minner mtight"><span class="minner mtight"><span class="mopen sizing reset-size3 size6 mtight delimcenter" style="top:0.075em"><span class="mtight">(</span></span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.879em"><span style="top:-2.656em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">σ</span></span></span></span><span style="top:-3.2255em"><span class="pstrut" style="height:3em"></span><span class="frac-line mtight" style="border-bottom-width:0.049em"></span></span><span style="top:-3.4624em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">μ</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mclose sizing reset-size3 size6 mtight delimcenter" style="top:0.075em"><span class="mtight">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.1039em"><span style="top:-3.1436em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p><ul>
<li class=""><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>μ</mi></mrow><annotation encoding="application/x-tex">\mu</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em"></span><span class="mord mathnormal">μ</span></span></span></span>：均值，控制分布中心位置</li>
<li class=""><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>σ</mi></mrow><annotation encoding="application/x-tex">\sigma</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal" style="margin-right:0.0359em">σ</span></span></span></span>：标准差，控制分布宽窄</li>
<li class=""><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>σ</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">\sigma^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">σ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>：方差</li>
</ul><p>当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>μ</mi><mo>=</mo><mn>0</mn><mo separator="true">,</mo><mi>σ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\mu=0, \sigma=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em"></span><span class="mord mathnormal">μ</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0359em">σ</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">1</span></span></span></span> 时为<strong>标准正态分布</strong>。</p></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="常用符号速查">常用符号速查<a href="https://pemako.github.io/blog/2026/04/17/math#%E5%B8%B8%E7%94%A8%E7%AC%A6%E5%8F%B7%E9%80%9F%E6%9F%A5" class="hash-link" aria-label="常用符号速查的直接链接" title="常用符号速查的直接链接" translate="no">​</a></h2>
<table><thead><tr><th>符号</th><th>命令</th><th>符号</th><th>命令</th></tr></thead><tbody><tr><td>∫</td><td><code>\int</code></td><td>∑</td><td><code>\sum</code></td></tr><tr><td>∞</td><td><code>\infty</code></td><td>±</td><td><code>\pm</code></td></tr><tr><td>×</td><td><code>\times</code></td><td>√</td><td><code>\sqrt{}</code></td></tr><tr><td>α</td><td><code>\alpha</code></td><td>β</td><td><code>\beta</code></td></tr><tr><td>γ</td><td><code>\gamma</code></td><td>δ</td><td><code>\delta</code></td></tr><tr><td>ξ</td><td><code>\xi</code></td><td>π</td><td><code>\pi</code></td></tr><tr><td>σ</td><td><code>\sigma</code></td><td>μ</td><td><code>\mu</code></td></tr><tr><td>λ</td><td><code>\lambda</code></td><td>ω</td><td><code>\omega</code></td></tr></tbody></table>
<p>完整符号列表参考：<a href="https://katex.org/docs/supported.html" target="_blank" rel="noopener noreferrer" class="">KaTeX Supported Functions</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="注意事项">注意事项<a href="https://pemako.github.io/blog/2026/04/17/math#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="注意事项的直接链接" title="注意事项的直接链接" translate="no">​</a></h2>
<p>多行公式（矩阵等）需写在一行内，避免换行被 Markdown 解析器处理：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$$\begin{pmatrix} a &amp; b \\ c &amp; d \end{pmatrix}$$</span><br></div></code></pre></div></div>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="提示块示例">提示块示例<a href="https://pemako.github.io/blog/2026/04/17/math#%E6%8F%90%E7%A4%BA%E5%9D%97%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="提示块示例的直接链接" title="提示块示例的直接链接" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_BuS1"><p><strong>Markdown content</strong> Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa</p></div></div>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>注意</div><div class="admonitionContent_BuS1"><p><strong>Markdown content</strong> Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa</p></div></div>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>危险</div><div class="admonitionContent_BuS1"><p><strong>Markdown content</strong> Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa</p></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bash 协进程（coproc）]]></title>
            <link>https://pemako.github.io/blog/coproc</link>
            <guid>https://pemako.github.io/blog/coproc</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[语法]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="语法">语法<a href="https://pemako.github.io/blog/coproc#%E8%AF%AD%E6%B3%95" class="hash-link" aria-label="语法的直接链接" title="语法的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">coproc [NAME] command [redirections]</span><br></div></code></pre></div></div>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="变量说明">变量说明<a href="https://pemako.github.io/blog/coproc#%E5%8F%98%E9%87%8F%E8%AF%B4%E6%98%8E" class="hash-link" aria-label="变量说明的直接链接" title="变量说明的直接链接" translate="no">​</a></h2>
<p>命名后 Shell 自动创建两个文件描述符：</p>

















<table><thead><tr><th>变量</th><th>含义</th></tr></thead><tbody><tr><td><code>NAME[0]</code></td><td>父 Shell <strong>读取</strong>协进程输出（连接协进程 stdout）</td></tr><tr><td><code>NAME[1]</code></td><td>父 Shell <strong>写入</strong>协进程输入（连接协进程 stdin）</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="通信原理">通信原理<a href="https://pemako.github.io/blog/coproc#%E9%80%9A%E4%BF%A1%E5%8E%9F%E7%90%86" class="hash-link" aria-label="通信原理的直接链接" title="通信原理的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">父 Shell                    协进程</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  │                            │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  │──── NAME[1] (写) ────────▶ stdin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  │◀─── NAME[0] (读) ───────── stdout</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="示例">示例<a href="https://pemako.github.io/blog/coproc#%E7%A4%BA%E4%BE%8B" class="hash-link" aria-label="示例的直接链接" title="示例的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-最简单的协进程">1. 最简单的协进程<a href="https://pemako.github.io/blog/coproc#1-%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E5%8D%8F%E8%BF%9B%E7%A8%8B" class="hash-link" aria-label="1. 最简单的协进程的直接链接" title="1. 最简单的协进程的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">coproc cat</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "hello" &gt;&amp;"${COPROC[1]}"   # 向协进程写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read line &lt;&amp;"${COPROC[0]}"      # 从协进程读</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "收到: $line"               # 输出: 收到: hello</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-命名协进程--bc-做计算器">2. 命名协进程 + bc 做计算器<a href="https://pemako.github.io/blog/coproc#2-%E5%91%BD%E5%90%8D%E5%8D%8F%E8%BF%9B%E7%A8%8B--bc-%E5%81%9A%E8%AE%A1%E7%AE%97%E5%99%A8" class="hash-link" aria-label="2. 命名协进程 + bc 做计算器的直接链接" title="2. 命名协进程 + bc 做计算器的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">coproc BC { bc -l; }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "3.14 * 2" &gt;&amp;"${BC[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read result &lt;&amp;"${BC[0]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "结果: $result"     # 结果: 6.28000000000000000000</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "sqrt(2)" &gt;&amp;"${BC[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read result &lt;&amp;"${BC[0]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "结果: $result"     # 结果: 1.41421356237309504880</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">exec {BC[1]}&gt;&amp;-</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-解决管道-subshell-变量丢失问题">3. 解决管道 subshell 变量丢失问题<a href="https://pemako.github.io/blog/coproc#3-%E8%A7%A3%E5%86%B3%E7%AE%A1%E9%81%93-subshell-%E5%8F%98%E9%87%8F%E4%B8%A2%E5%A4%B1%E9%97%AE%E9%A2%98" class="hash-link" aria-label="3. 解决管道 subshell 变量丢失问题的直接链接" title="3. 解决管道 subshell 变量丢失问题的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 普通管道的问题：变量在 subshell 里修改，父 Shell 看不到</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">count=0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cat /etc/passwd | while read line; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ((count++))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $count   # 输出 0，变量丢失！</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 用协进程解决</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">count=0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">coproc READER { cat /etc/passwd; }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">while read line &lt;&amp;"${READER[0]}"; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ((count++))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $count   # 正确输出行数</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-长连接复用避免重复启动进程">4. 长连接复用（避免重复启动进程）<a href="https://pemako.github.io/blog/coproc#4-%E9%95%BF%E8%BF%9E%E6%8E%A5%E5%A4%8D%E7%94%A8%E9%81%BF%E5%85%8D%E9%87%8D%E5%A4%8D%E5%90%AF%E5%8A%A8%E8%BF%9B%E7%A8%8B" class="hash-link" aria-label="4. 长连接复用（避免重复启动进程）的直接链接" title="4. 长连接复用（避免重复启动进程）的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">coproc SSH { ssh user@server 'while read cmd; do eval "$cmd"; done'; }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "ls /tmp" &gt;&amp;"${SSH[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read output &lt;&amp;"${SSH[0]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "$output"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "whoami" &gt;&amp;"${SSH[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read output &lt;&amp;"${SSH[0]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "$output"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">exec {SSH[1]}&gt;&amp;-</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-多个命名协进程并行工作">5. 多个命名协进程并行工作<a href="https://pemako.github.io/blog/coproc#5-%E5%A4%9A%E4%B8%AA%E5%91%BD%E5%90%8D%E5%8D%8F%E8%BF%9B%E7%A8%8B%E5%B9%B6%E8%A1%8C%E5%B7%A5%E4%BD%9C" class="hash-link" aria-label="5. 多个命名协进程并行工作的直接链接" title="5. 多个命名协进程并行工作的直接链接" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">coproc WORKER1 { while read x; do echo "$((x * 2))"; done; }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">coproc WORKER2 { while read x; do echo "$((x * x))"; done; }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for i in 1 2 3 4 5; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo $i &gt;&amp;"${WORKER1[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo $i &gt;&amp;"${WORKER2[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    read r1 &lt;&amp;"${WORKER1[0]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    read r2 &lt;&amp;"${WORKER2[0]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo "$i -&gt; 双倍: $r1, 平方: $r2"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">exec {WORKER1[1]}&gt;&amp;-</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">exec {WORKER2[1]}&gt;&amp;-</span><br></div></code></pre></div></div>
<p>输出：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">1 -&gt; 双倍: 2, 平方: 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2 -&gt; 双倍: 4, 平方: 4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3 -&gt; 双倍: 6, 平方: 9</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">4 -&gt; 双倍: 8, 平方: 16</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">5 -&gt; 双倍: 10, 平方: 25</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="注意事项">注意事项<a href="https://pemako.github.io/blog/coproc#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" class="hash-link" aria-label="注意事项的直接链接" title="注意事项的直接链接" translate="no">​</a></h2>

























<table><thead><tr><th>问题</th><th>说明</th></tr></thead><tbody><tr><td>死锁</td><td>父子双方都在等对方写会卡住，需注意读写顺序</td></tr><tr><td>缓冲</td><td>协进程输出有缓冲，行缓冲命令（如 <code>grep</code>）需加 <code>--line-buffered</code></td></tr><tr><td>关闭</td><td>用完后用 <code>exec {NAME[1]}&gt;&amp;-</code> 关闭写端，协进程读到 EOF 才会退出</td></tr><tr><td>数量</td><td>匿名协进程（无 NAME）同时只能有一个</td></tr></tbody></table>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Parameter Expansion]]></title>
            <link>https://pemako.github.io/blog/parameter-expansion</link>
            <guid>https://pemako.github.io/blog/parameter-expansion</guid>
            <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Bash 手册参考：https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Bash 手册参考：<a href="https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion" target="_blank" rel="noopener noreferrer" class="">https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion</a></p>
</blockquote>
<!-- -->
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一默认值--赋值--报错--替换冒号系列">一、默认值 / 赋值 / 报错 / 替换（冒号系列）<a href="https://pemako.github.io/blog/parameter-expansion#%E4%B8%80%E9%BB%98%E8%AE%A4%E5%80%BC--%E8%B5%8B%E5%80%BC--%E6%8A%A5%E9%94%99--%E6%9B%BF%E6%8D%A2%E5%86%92%E5%8F%B7%E7%B3%BB%E5%88%97" class="hash-link" aria-label="一、默认值 / 赋值 / 报错 / 替换（冒号系列）的直接链接" title="一、默认值 / 赋值 / 报错 / 替换（冒号系列）的直接链接" translate="no">​</a></h2>
<p>这四个展开共享同一个逻辑前提：<strong>判断变量是否"unset 或为空"</strong>。
去掉冒号 <code>:</code> 时，只判断是否 <strong>unset</strong>（空字符串不触发）。</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-parameter-word--取默认值default-value">1. <code>${parameter:-word}</code> — 取默认值（Default Value）<a href="https://pemako.github.io/blog/parameter-expansion#1-parameter-word--%E5%8F%96%E9%BB%98%E8%AE%A4%E5%80%BCdefault-value" class="hash-link" aria-label="1-parameter-word--取默认值default-value的直接链接" title="1-parameter-word--取默认值default-value的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 若 <code>parameter</code> unset 或为空，展开为 <code>word</code>；否则展开为 <code>parameter</code> 的值。
<strong>变量本身不被修改。</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:-"Guest"}     # 输出: Guest  （为空，用默认值）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $name                # 输出:         （变量仍为空）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:-"Guest"}     # 输出: Alice  （有值，用原值）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unset age</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${age:-18}           # 输出: 18     （未设置，用默认值）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉冒号：只检查 unset，不检查空字符串</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name-"Guest"}      # 输出:         （空字符串不触发，输出空）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unset name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name-"Guest"}      # 输出: Guest  （未设置，触发默认值）</span><br></div></code></pre></div></div>
<p><strong>典型用途：</strong> 函数参数默认值、脚本配置兜底</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">port=${PORT:-8080}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">log_dir=${LOG_DIR:-"/var/log/myapp"}</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-parameterword--赋默认值assign-default">2. <code>${parameter:=word}</code> — 赋默认值（Assign Default）<a href="https://pemako.github.io/blog/parameter-expansion#2-parameterword--%E8%B5%8B%E9%BB%98%E8%AE%A4%E5%80%BCassign-default" class="hash-link" aria-label="2-parameterword--赋默认值assign-default的直接链接" title="2-parameterword--赋默认值assign-default的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 若 <code>parameter</code> unset 或为空，将 <code>word</code> <strong>赋值给 parameter</strong>，并展开为 <code>word</code>；否则展开为 <code>parameter</code> 的值。
<strong>变量被永久修改。</strong></p>
<blockquote>
<p>注意：不能用于位置参数（<code>$1</code>, <code>$2</code>）和特殊参数（<code>$@</code>, <code>$*</code>）。</p>
</blockquote>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">unset config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${config:="/etc/app.conf"}   # 输出: /etc/app.conf</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $config                       # 输出: /etc/app.conf  （变量已被赋值）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:="Anonymous"}         # 输出: Anonymous</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $name                         # 输出: Anonymous      （空字符串也被赋值）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉冒号：只对 unset 赋值</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name="Bob"}                # 输出:                 （空字符串不触发，不赋值）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $name                         # 输出:                 （仍为空）</span><br></div></code></pre></div></div>
<p><strong>典型用途：</strong> 初始化全局变量（只初始化一次）</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">: ${TMPDIR:=/tmp}          # 常见惯用写法：用 : 命令丢弃展开值</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">: ${MAX_RETRY:=3}</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-parameterword--未设置则报错error-if-unset">3. <code>${parameter:?word}</code> — 未设置则报错（Error if Unset）<a href="https://pemako.github.io/blog/parameter-expansion#3-parameterword--%E6%9C%AA%E8%AE%BE%E7%BD%AE%E5%88%99%E6%8A%A5%E9%94%99error-if-unset" class="hash-link" aria-label="3-parameterword--未设置则报错error-if-unset的直接链接" title="3-parameterword--未设置则报错error-if-unset的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 若 <code>parameter</code> unset 或为空，向标准错误输出 <code>word</code> 并<strong>退出脚本</strong>（非交互式 shell）；否则展开为 <code>parameter</code> 的值。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">unset required_arg</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${required_arg:?"required_arg must be set"}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 输出到 stderr: bash: required_arg: required_arg must be set</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 脚本退出，退出码为 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:?"name cannot be empty"}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 输出到 stderr: bash: name: name cannot be empty</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:?"name cannot be empty"}   # 输出: Alice（正常执行）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉冒号：只对 unset 报错</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name?"name is unset"}           # 输出:   （空字符串不触发，正常通过）</span><br></div></code></pre></div></div>
<p><strong>典型用途：</strong> 脚本入口参数强制校验</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">DB_HOST=${DB_HOST:?"环境变量 DB_HOST 未设置，请配置后重试"}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">API_KEY=${API_KEY:?"API_KEY 不能为空"}</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-parameterword--有值则替换alternate-value">4. <code>${parameter:+word}</code> — 有值则替换（Alternate Value）<a href="https://pemako.github.io/blog/parameter-expansion#4-parameterword--%E6%9C%89%E5%80%BC%E5%88%99%E6%9B%BF%E6%8D%A2alternate-value" class="hash-link" aria-label="4-parameterword--有值则替换alternate-value的直接链接" title="4-parameterword--有值则替换alternate-value的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 若 <code>parameter</code> unset 或为空，展开为<strong>空字符串</strong>；若有值，展开为 <code>word</code>（变量本身不被修改）。
<strong>与 <code>:-</code> 逻辑相反。</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">name="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:+"Hello, $name!"}    # 输出: Hello, Alice!  （有值，用 word）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name:+"Hello"}            # 输出:                 （为空，展开为空）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unset flag</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${flag:+"-v"}               # 输出:                 （未设置，展开为空）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flag=1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${flag:+"-v"}               # 输出: -v             （有值，输出 word）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉冒号：只检查 unset</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name+"exists"}            # 输出: exists          （空字符串也算"已设置"）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unset name</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name+"exists"}            # 输出:                 （未设置，才展开为空）</span><br></div></code></pre></div></div>
<p><strong>典型用途：</strong> 条件性添加参数</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">verbose=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">debug=1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cmd="myapp ${verbose:+-v} ${debug:+--debug}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 等价于: cmd="myapp  --debug"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 数组追加元素（判断变量是否存在）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">extra_args=${EXTRA:+"--extra=$EXTRA"}</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="二子字符串截取">二、子字符串截取<a href="https://pemako.github.io/blog/parameter-expansion#%E4%BA%8C%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%88%AA%E5%8F%96" class="hash-link" aria-label="二、子字符串截取的直接链接" title="二、子字符串截取的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-parameteroffset--从偏移位置截取到末尾">5. <code>${parameter:offset}</code> — 从偏移位置截取到末尾<a href="https://pemako.github.io/blog/parameter-expansion#5-parameteroffset--%E4%BB%8E%E5%81%8F%E7%A7%BB%E4%BD%8D%E7%BD%AE%E6%88%AA%E5%8F%96%E5%88%B0%E6%9C%AB%E5%B0%BE" class="hash-link" aria-label="5-parameteroffset--从偏移位置截取到末尾的直接链接" title="5-parameteroffset--从偏移位置截取到末尾的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 从 <code>offset</code> 位置开始，截取到字符串末尾。</p>
<ul>
<li class="">索引从 <code>0</code> 开始</li>
<li class=""><code>offset</code> 为负数时，从末尾倒数（负数前需有空格或用括号，避免与 <code>:-</code> 混淆）</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="Hello, World!"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:7}           # 输出: World!    （从第7个字符开始）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:0}           # 输出: Hello, World!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:1}           # 输出: ello, World!</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 负数偏移：从末尾倒数</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str: -6}         # 输出: World!    （注意冒号后有空格）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:(-6)}        # 输出: World!    （括号写法）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 位置参数同样适用</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -- "apple" "banana" "cherry"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${@:2}             # 输出: banana cherry  （从第2个参数开始）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${@:1}             # 输出: apple banana cherry</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-parameteroffsetlength--截取指定长度">6. <code>${parameter:offset:length}</code> — 截取指定长度<a href="https://pemako.github.io/blog/parameter-expansion#6-parameteroffsetlength--%E6%88%AA%E5%8F%96%E6%8C%87%E5%AE%9A%E9%95%BF%E5%BA%A6" class="hash-link" aria-label="6-parameteroffsetlength--截取指定长度的直接链接" title="6-parameteroffsetlength--截取指定长度的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 从 <code>offset</code> 开始，截取 <code>length</code> 个字符。</p>
<ul>
<li class=""><code>length</code> 为负数时，表示<strong>距末尾的偏移</strong>（截取到倒数第 |length| 个字符前）</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="Hello, World!"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:7:5}         # 输出: World</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:0:5}         # 输出: Hello</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:7:1}         # 输出: W</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 负数 length：截取到距末尾 N 个字符前</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:0:-1}        # 输出: Hello, World   （去掉最后1个字符）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str:7:-1}        # 输出: World          （去掉最后1个字符，从第7位开始）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 数组截取</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">arr=(a b c d e)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr[@]:1:3}      # 输出: b c d          （从索引1开始，取3个元素）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr[@]: -2}      # 输出: d e            （最后2个元素）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 位置参数截取</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -- one two three four five</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${@:2:3}           # 输出: two three four</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="三间接引用--变量名展开">三、间接引用 / 变量名展开<a href="https://pemako.github.io/blog/parameter-expansion#%E4%B8%89%E9%97%B4%E6%8E%A5%E5%BC%95%E7%94%A8--%E5%8F%98%E9%87%8F%E5%90%8D%E5%B1%95%E5%BC%80" class="hash-link" aria-label="三、间接引用 / 变量名展开的直接链接" title="三、间接引用 / 变量名展开的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-prefix--列出以-prefix-开头的变量名拼接为单词">7. <code>${!prefix*}</code> — 列出以 prefix 开头的变量名（拼接为单词）<a href="https://pemako.github.io/blog/parameter-expansion#7-prefix--%E5%88%97%E5%87%BA%E4%BB%A5-prefix-%E5%BC%80%E5%A4%B4%E7%9A%84%E5%8F%98%E9%87%8F%E5%90%8D%E6%8B%BC%E6%8E%A5%E4%B8%BA%E5%8D%95%E8%AF%8D" class="hash-link" aria-label="7-prefix--列出以-prefix-开头的变量名拼接为单词的直接链接" title="7-prefix--列出以-prefix-开头的变量名拼接为单词的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 展开为所有以 <code>prefix</code> 开头的变量名，用 <code>IFS</code> 的第一个字符分隔（通常是空格）。
结果是一个<strong>单个字符串</strong>（类似 <code>$*</code>）。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">MY_APP_HOST="localhost"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MY_APP_PORT="8080"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MY_APP_NAME="demo"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">OTHER_VAR="ignored"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${!MY_APP*}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 输出: MY_APP_HOST MY_APP_NAME MY_APP_PORT</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 遍历（不推荐，有分词问题）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for var in ${!MY_APP*}; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo "$var = ${!var}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 输出:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># MY_APP_HOST = localhost</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># MY_APP_NAME = demo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># MY_APP_PORT = 8080</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-prefix--列出以-prefix-开头的变量名独立引号安全">8. <code>${!prefix@}</code> — 列出以 prefix 开头的变量名（独立引号安全）<a href="https://pemako.github.io/blog/parameter-expansion#8-prefix--%E5%88%97%E5%87%BA%E4%BB%A5-prefix-%E5%BC%80%E5%A4%B4%E7%9A%84%E5%8F%98%E9%87%8F%E5%90%8D%E7%8B%AC%E7%AB%8B%E5%BC%95%E5%8F%B7%E5%AE%89%E5%85%A8" class="hash-link" aria-label="8-prefix--列出以-prefix-开头的变量名独立引号安全的直接链接" title="8-prefix--列出以-prefix-开头的变量名独立引号安全的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 与 <code>${!prefix*}</code> 相同，但在双引号内展开时，每个变量名是独立的词（类似 <code>$@</code>）。
<strong>推荐使用 <code>@</code> 版本</strong>，更安全。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">MY_HOST="localhost"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MY_PORT="8080"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">MY_NAME="my app"   # 含空格</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 使用 * 版本（双引号内合并为一个字符串）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for var in "${!MY_*}"; do echo "[$var]"; done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 输出: [MY_HOST MY_NAME MY_PORT]   ← 全部合并成一个词，错误！</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 使用 @ 版本（双引号内每个名字独立）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for var in "${!MY_@}"; do echo "[$var]"; done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 输出:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># [MY_HOST]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># [MY_NAME]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># [MY_PORT]</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="9-name--数组所有下标独立元素">9. <code>${!name[@]}</code> — 数组所有下标（独立元素）<a href="https://pemako.github.io/blog/parameter-expansion#9-name--%E6%95%B0%E7%BB%84%E6%89%80%E6%9C%89%E4%B8%8B%E6%A0%87%E7%8B%AC%E7%AB%8B%E5%85%83%E7%B4%A0" class="hash-link" aria-label="9-name--数组所有下标独立元素的直接链接" title="9-name--数组所有下标独立元素的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 展开为数组 <code>name</code> 的所有<strong>下标/键</strong>，在双引号内每个下标是独立的词。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 普通索引数组</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fruits=("apple" "banana" "cherry")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${!fruits[@]}        # 输出: 0 1 2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 稀疏数组（跳过元素后下标不连续）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sparse=()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sparse[0]="zero"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sparse[3]="three"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sparse[7]="seven"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${!sparse[@]}        # 输出: 0 3 7</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 关联数组（哈希表）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -A person</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">person[name]="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">person[age]="30"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">person[city]="Beijing"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${!person[@]}        # 输出: name age city（顺序不定）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 安全遍历关联数组</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for key in "${!person[@]}"; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo "$key =&gt; ${person[$key]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="10-name--数组所有下标单字符串">10. <code>${!name[*]}</code> — 数组所有下标（单字符串）<a href="https://pemako.github.io/blog/parameter-expansion#10-name--%E6%95%B0%E7%BB%84%E6%89%80%E6%9C%89%E4%B8%8B%E6%A0%87%E5%8D%95%E5%AD%97%E7%AC%A6%E4%B8%B2" class="hash-link" aria-label="10-name--数组所有下标单字符串的直接链接" title="10-name--数组所有下标单字符串的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 与 <code>${!name[@]}</code> 相同，但在双引号内合并为一个字符串（用 <code>IFS</code> 分隔）。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">declare -A config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">config[host]="localhost"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">config[port]="5432"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># @ 版本：双引号内独立词（推荐）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for key in "${!config[@]}"; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo "$key"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># * 版本：双引号内合并为一个字符串</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "${!config[*]}"      # 输出: host port（单个字符串）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 对比</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">keys_at=("${!config[@]}")    # 正确：每个键独立成元素</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">keys_star=("${!config[*]}")  # 错误：所有键合并为一个元素</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#keys_at[@]}           # 输出: 2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#keys_star[@]}         # 输出: 1</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="四长度">四、长度<a href="https://pemako.github.io/blog/parameter-expansion#%E5%9B%9B%E9%95%BF%E5%BA%A6" class="hash-link" aria-label="四、长度的直接链接" title="四、长度的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="11-parameter--字符串长度--数组元素个数">11. <code>${#parameter}</code> — 字符串长度 / 数组元素个数<a href="https://pemako.github.io/blog/parameter-expansion#11-parameter--%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%95%BF%E5%BA%A6--%E6%95%B0%E7%BB%84%E5%85%83%E7%B4%A0%E4%B8%AA%E6%95%B0" class="hash-link" aria-label="11-parameter--字符串长度--数组元素个数的直接链接" title="11-parameter--字符串长度--数组元素个数的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong></p>
<ul>
<li class="">普通变量：展开为字符串的<strong>字符数</strong></li>
<li class=""><code>${#*}</code> 或 <code>${#@}</code>：展开为<strong>位置参数的个数</strong></li>
<li class=""><code>${#array[@]}</code> 或 <code>${#array[*]}</code>：展开为数组<strong>元素个数</strong></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 字符串长度</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str="Hello"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#str}              # 输出: 5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str="你好世界"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#str}              # 输出: 4  （字符数，非字节数）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">empty=""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#empty}            # 输出: 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 未设置的变量</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unset undef</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#undef}            # 输出: 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 位置参数个数</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">set -- a b c d</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#@}                # 输出: 4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#*}                # 输出: 4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 数组元素个数</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">arr=(one two three)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#arr[@]}           # 输出: 3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#arr[*]}           # 输出: 3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 特定元素的长度</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#arr[1]}           # 输出: 3  （"two" 的长度）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 关联数组</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -A map=([a]=1 [b]=2 [c]=3)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${#map[@]}           # 输出: 3</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="五前缀后缀删除模式匹配">五、前缀/后缀删除（模式匹配）<a href="https://pemako.github.io/blog/parameter-expansion#%E4%BA%94%E5%89%8D%E7%BC%80%E5%90%8E%E7%BC%80%E5%88%A0%E9%99%A4%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="五、前缀/后缀删除（模式匹配）的直接链接" title="五、前缀/后缀删除（模式匹配）的直接链接" translate="no">​</a></h2>
<blockquote>
<p><strong>记忆关键：<code>#</code> 从前删，<code>%</code> 从后删；单符号最短匹配，双符号最长匹配</strong></p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="12-parameterword--删除最短前缀匹配">12. <code>${parameter#word}</code> — 删除最短前缀匹配<a href="https://pemako.github.io/blog/parameter-expansion#12-parameterword--%E5%88%A0%E9%99%A4%E6%9C%80%E7%9F%AD%E5%89%8D%E7%BC%80%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="12-parameterword--删除最短前缀匹配的直接链接" title="12-parameterword--删除最短前缀匹配的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 从字符串<strong>开头</strong>匹配 <code>word</code> 模式（glob），删除<strong>最短</strong>匹配部分。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">path="/usr/local/bin/bash"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path#/}            # 输出: usr/local/bin/bash    （删除开头的 /）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path#*/}           # 输出: local/bin/bash        （最短匹配：删到第一个 / 后）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path#/usr}         # 输出: /local/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 提取文件名（basename 等效）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path##*/}          # 输出: bash                  （## 最长匹配，见下一条）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">file="report.tar.gz"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file#*.}           # 输出: tar.gz                （删除第一个点前的内容）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># URL 处理</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">url="https://www.example.com/path"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${url#*://}          # 输出: www.example.com/path</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="13-parameterword--删除最长前缀匹配">13. <code>${parameter##word}</code> — 删除最长前缀匹配<a href="https://pemako.github.io/blog/parameter-expansion#13-parameterword--%E5%88%A0%E9%99%A4%E6%9C%80%E9%95%BF%E5%89%8D%E7%BC%80%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="13-parameterword--删除最长前缀匹配的直接链接" title="13-parameterword--删除最长前缀匹配的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 从字符串<strong>开头</strong>匹配 <code>word</code> 模式，删除<strong>最长</strong>匹配部分。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">path="/usr/local/bin/bash"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path##*/}          # 输出: bash                  （最长匹配：删到最后一个 /）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path##/usr}        # 输出: /local/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">file="report.tar.gz"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file##*.}          # 输出: gz                    （最长匹配：删到最后一个点）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 与 # 的区别</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file#*.}           # 输出: tar.gz   （最短：第一个点）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file##*.}          # 输出: gz       （最长：最后一个点）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 实用：提取文件扩展名</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">filename="archive.tar.gz"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${filename##*.}      # 输出: gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 提取目录路径（dirname 等效）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">path="/home/user/docs/file.txt"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dir="${path%/*}"          # 见 % 部分</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="14-parameterword--删除最短后缀匹配">14. <code>${parameter%word}</code> — 删除最短后缀匹配<a href="https://pemako.github.io/blog/parameter-expansion#14-parameterword--%E5%88%A0%E9%99%A4%E6%9C%80%E7%9F%AD%E5%90%8E%E7%BC%80%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="14-parameterword--删除最短后缀匹配的直接链接" title="14-parameterword--删除最短后缀匹配的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 从字符串<strong>末尾</strong>匹配 <code>word</code> 模式，删除<strong>最短</strong>匹配部分。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">path="/usr/local/bin/bash"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path%/*}           # 输出: /usr/local/bin        （删除最后一个 /bash）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path%bash}         # 输出: /usr/local/bin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">file="report.tar.gz"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file%.*}           # 输出: report.tar            （删除最后一个点及后缀）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉文件扩展名（单层）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file%.gz}          # 输出: report.tar</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file%.tar.gz}      # 输出: report</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 提取目录（dirname 等效）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">full_path="/home/user/docs/file.txt"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${full_path%/*}      # 输出: /home/user/docs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉末尾斜杠</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dir="/var/log/"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${dir%/}             # 输出: /var/log</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="15-parameterword--删除最长后缀匹配">15. <code>${parameter%%word}</code> — 删除最长后缀匹配<a href="https://pemako.github.io/blog/parameter-expansion#15-parameterword--%E5%88%A0%E9%99%A4%E6%9C%80%E9%95%BF%E5%90%8E%E7%BC%80%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="15-parameterword--删除最长后缀匹配的直接链接" title="15-parameterword--删除最长后缀匹配的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 从字符串<strong>末尾</strong>匹配 <code>word</code> 模式，删除<strong>最长</strong>匹配部分。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">path="/usr/local/bin/bash"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path%%/*}          # 输出:   （最长匹配：从末尾往前，匹配所有含 / 的内容，结果为空）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">file="report.tar.gz"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file%%.*}          # 输出: report                （删除第一个点及其后所有内容）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 与 % 的区别</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file%.*}           # 输出: report.tar   （最短：最后一个点）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file%%.*}          # 输出: report        （最长：第一个点）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># URL 提取协议</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">url="https://www.example.com/path?q=1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${url%%://*}         # 输出: https</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># CSV 第一列</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">csv="alice,30,Beijing,engineer"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${csv%%,*}           # 输出: alice</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="六子字符串替换">六、子字符串替换<a href="https://pemako.github.io/blog/parameter-expansion#%E5%85%AD%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9B%BF%E6%8D%A2" class="hash-link" aria-label="六、子字符串替换的直接链接" title="六、子字符串替换的直接链接" translate="no">​</a></h2>
<blockquote>
<p><strong>记忆关键：<code>/</code> 替换第一个，<code>//</code> 替换全部；<code>/#</code> 锚定开头，<code>/%</code> 锚定结尾</strong></p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="16-parameterpatternstring--替换第一个匹配">16. <code>${parameter/pattern/string}</code> — 替换第一个匹配<a href="https://pemako.github.io/blog/parameter-expansion#16-parameterpatternstring--%E6%9B%BF%E6%8D%A2%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="16-parameterpatternstring--替换第一个匹配的直接链接" title="16-parameterpatternstring--替换第一个匹配的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 将 <code>parameter</code> 中<strong>第一个</strong>匹配 <code>pattern</code> 的部分替换为 <code>string</code>。
若 <code>string</code> 省略，则删除匹配部分。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world hello"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/hello/hi}              # 输出: hi world hello    （只替换第一个）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/hello/}                # 输出:  world hello      （删除第一个）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/ /_}                   # 输出: hello_world hello （替换第一个空格）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># glob 模式匹配</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">path="/usr/local/bin"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path/\/usr/\/opt}          # 输出: /opt/local/bin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 匹配任意字符</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str="2024-01-15"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/-/\/}                  # 输出: 2024/01-15        （替换第一个 -）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 删除匹配</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">filename="  spaces  "</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${filename/ /}               # 输出:  spaces  （只删一个空格）</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="17-parameterpatternstring--替换所有匹配">17. <code>${parameter//pattern/string}</code> — 替换所有匹配<a href="https://pemako.github.io/blog/parameter-expansion#17-parameterpatternstring--%E6%9B%BF%E6%8D%A2%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D" class="hash-link" aria-label="17-parameterpatternstring--替换所有匹配的直接链接" title="17-parameterpatternstring--替换所有匹配的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 将 <code>parameter</code> 中<strong>所有</strong>匹配 <code>pattern</code> 的部分替换为 <code>string</code>。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world hello"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str//hello/hi}             # 输出: hi world hi      （替换所有）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str// /_}                  # 输出: hello_world_hello（所有空格换下划线）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str//l/L}                  # 输出: heLLo worLd heLLo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 删除所有匹配</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str="a1b2c3d4"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str//[0-9]/}               # 输出: abcd             （删除所有数字）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 转义特殊字符</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">path="/home/user/my dir/file"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path// /\\ }               # 输出: /home/user/my\ dir/file</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 实用：去除所有空格</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">input="  hello   world  "</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${input// /}                 # 输出: helloworld</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 替换换行（结合 $'\n'）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str=$'line1\nline2\nline3'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str//$'\n'/ | }            # 输出: line1 | line2 | line3</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="18-parameterpatternstring--替换开头匹配锚定前缀">18. <code>${parameter/#pattern/string}</code> — 替换开头匹配（锚定前缀）<a href="https://pemako.github.io/blog/parameter-expansion#18-parameterpatternstring--%E6%9B%BF%E6%8D%A2%E5%BC%80%E5%A4%B4%E5%8C%B9%E9%85%8D%E9%94%9A%E5%AE%9A%E5%89%8D%E7%BC%80" class="hash-link" aria-label="18-parameterpatternstring--替换开头匹配锚定前缀的直接链接" title="18-parameterpatternstring--替换开头匹配锚定前缀的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 仅当 <code>pattern</code> 匹配字符串<strong>开头</strong>时才替换。等效于 <code>pattern</code> 前加 <code>^</code>。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/#hello/hi}             # 输出: hi world          （开头匹配，替换）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/#world/earth}          # 输出: hello world       （不在开头，不替换）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/#h/H}                  # 输出: Hello world</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 添加前缀</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">files="file.txt"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${files/#file/backup_file}   # 输出: backup_file.txt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉开头的 ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">path="./src/main.go"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path/#.\//}                # 输出: src/main.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 条件添加协议头</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">url="example.com"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${url/#http:\/\//}           # 输出: example.com（无 http:// 前缀，不变）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">url2="http://example.com"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${url2/#http:\/\//https://}  # 输出: https://example.com</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="19-parameterpatternstring--替换结尾匹配锚定后缀">19. <code>${parameter/%pattern/string}</code> — 替换结尾匹配（锚定后缀）<a href="https://pemako.github.io/blog/parameter-expansion#19-parameterpatternstring--%E6%9B%BF%E6%8D%A2%E7%BB%93%E5%B0%BE%E5%8C%B9%E9%85%8D%E9%94%9A%E5%AE%9A%E5%90%8E%E7%BC%80" class="hash-link" aria-label="19-parameterpatternstring--替换结尾匹配锚定后缀的直接链接" title="19-parameterpatternstring--替换结尾匹配锚定后缀的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 仅当 <code>pattern</code> 匹配字符串<strong>末尾</strong>时才替换。等效于 <code>pattern</code> 后加 <code>$</code>。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/%world/earth}          # 输出: hello earth       （末尾匹配，替换）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/%hello/hi}             # 输出: hello world       （不在末尾，不替换）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 修改文件扩展名</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">file="report.txt"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${file/%.txt/.md}            # 输出: report.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 批量重命名扩展名</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for f in *.txt; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    mv "$f" "${f/%.txt/.md}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 去掉末尾斜杠</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dir="/var/log/"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${dir/%\//}                  # 输出: /var/log</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 添加后缀（如果不以特定字符结尾）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str="hello"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str/%o/o!}                 # 输出: hello!</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="七大小写转换">七、大小写转换<a href="https://pemako.github.io/blog/parameter-expansion#%E4%B8%83%E5%A4%A7%E5%B0%8F%E5%86%99%E8%BD%AC%E6%8D%A2" class="hash-link" aria-label="七、大小写转换的直接链接" title="七、大小写转换的直接链接" translate="no">​</a></h2>
<blockquote>
<p><strong>记忆关键：<code>^</code> 转大写，<code>,</code> 转小写；单符号转第一个，双符号转全部</strong></p>
</blockquote>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="20-parameterpattern--首字母匹配字符转大写">20. <code>${parameter^pattern}</code> — 首字母/匹配字符转大写<a href="https://pemako.github.io/blog/parameter-expansion#20-parameterpattern--%E9%A6%96%E5%AD%97%E6%AF%8D%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E8%BD%AC%E5%A4%A7%E5%86%99" class="hash-link" aria-label="20-parameterpattern--首字母匹配字符转大写的直接链接" title="20-parameterpattern--首字母匹配字符转大写的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 将字符串中<strong>第一个</strong>匹配 <code>pattern</code> 的字符转为大写。
若 <code>pattern</code> 省略，默认匹配任意字符（即转首字母大写）。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^}              # 输出: Hello world    （首字母大写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^h}             # 输出: Hello world    （匹配 h，转大写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^[aeiou]}       # 输出: hello world    （首字母 h 不是元音，不转）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str2="apple"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str2^[aeiou]}      # 输出: Apple          （首字母是元音，转大写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 转首字母大写（标题格式）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name="alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name^}             # 输出: Alice</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-parameterpattern--所有匹配字符转大写">21. <code>${parameter^^pattern}</code> — 所有匹配字符转大写<a href="https://pemako.github.io/blog/parameter-expansion#21-parameterpattern--%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E8%BD%AC%E5%A4%A7%E5%86%99" class="hash-link" aria-label="21-parameterpattern--所有匹配字符转大写的直接链接" title="21-parameterpattern--所有匹配字符转大写的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 将字符串中<strong>所有</strong>匹配 <code>pattern</code> 的字符转为大写。
若 <code>pattern</code> 省略，将整个字符串转为大写。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^^}             # 输出: HELLO WORLD    （全部大写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^^[aeiou]}      # 输出: hEllO wOrld    （只有元音转大写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^^[a-z]}        # 输出: HELLO WORLD    （所有小写字母转大写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str^^h}            # 输出: Hello world    （只转 h）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 环境变量风格命名</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">var_name="my_config_value"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${var_name^^}        # 输出: MY_CONFIG_VALUE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 数组元素大写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">arr=(apple banana cherry)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr[@]^^}          # 输出: APPLE BANANA CHERRY</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-parameterpattern--首字母匹配字符转小写">22. <code>${parameter,pattern}</code> — 首字母/匹配字符转小写<a href="https://pemako.github.io/blog/parameter-expansion#22-parameterpattern--%E9%A6%96%E5%AD%97%E6%AF%8D%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E8%BD%AC%E5%B0%8F%E5%86%99" class="hash-link" aria-label="22-parameterpattern--首字母匹配字符转小写的直接链接" title="22-parameterpattern--首字母匹配字符转小写的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 将字符串中<strong>第一个</strong>匹配 <code>pattern</code> 的字符转为小写。
若 <code>pattern</code> 省略，只转首字母小写。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="HELLO WORLD"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str,}              # 输出: hELLO WORLD    （首字母小写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str,H}             # 输出: hELLO WORLD    （匹配 H，转小写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str,[A-Z]}         # 输出: hELLO WORLD    （第一个大写字母转小写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 驼峰命名首字母小写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">class_name="MyClassName"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${class_name,}       # 输出: myClassName</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="23-parameterpattern--所有匹配字符转小写">23. <code>${parameter,,pattern}</code> — 所有匹配字符转小写<a href="https://pemako.github.io/blog/parameter-expansion#23-parameterpattern--%E6%89%80%E6%9C%89%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E8%BD%AC%E5%B0%8F%E5%86%99" class="hash-link" aria-label="23-parameterpattern--所有匹配字符转小写的直接链接" title="23-parameterpattern--所有匹配字符转小写的直接链接" translate="no">​</a></h3>
<p><strong>规则：</strong> 将字符串中<strong>所有</strong>匹配 <code>pattern</code> 的字符转为小写。
若 <code>pattern</code> 省略，将整个字符串转为小写。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="HELLO WORLD"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str,,}             # 输出: hello world    （全部小写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str,,[AEIOU]}      # 输出: hELLO wORLD    （只有大写元音转小写）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str,,[A-Z]}        # 输出: hello world</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 规范化用户输入</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read -p "Enter choice (Y/N): " choice</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">case ${choice,,} in</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    y|yes) echo "Confirmed" ;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    n|no)  echo "Cancelled" ;;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">esac</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 数组元素小写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">arr=(APPLE BANANA CHERRY)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr[@],,}          # 输出: apple banana cherry</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="八参数转换操作符">八、参数转换操作符<a href="https://pemako.github.io/blog/parameter-expansion#%E5%85%AB%E5%8F%82%E6%95%B0%E8%BD%AC%E6%8D%A2%E6%93%8D%E4%BD%9C%E7%AC%A6" class="hash-link" aria-label="八、参数转换操作符的直接链接" title="八、参数转换操作符的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="24-parameteroperator--参数变换">24. <code>${parameter@operator}</code> — 参数变换<a href="https://pemako.github.io/blog/parameter-expansion#24-parameteroperator--%E5%8F%82%E6%95%B0%E5%8F%98%E6%8D%A2" class="hash-link" aria-label="24-parameteroperator--参数变换的直接链接" title="24-parameteroperator--参数变换的直接链接" translate="no">​</a></h3>
<p><code>operator</code> 是单个字母，不同字母执行不同变换：</p>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameteru--转大写同-"><code>${parameter@U}</code> — 转大写（同 <code>^^</code>）<a href="https://pemako.github.io/blog/parameter-expansion#parameteru--%E8%BD%AC%E5%A4%A7%E5%86%99%E5%90%8C-" class="hash-link" aria-label="parameteru--转大写同-的直接链接" title="parameteru--转大写同-的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str@U}             # 输出: HELLO WORLD</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameteru--首字母转大写同-"><code>${parameter@u}</code> — 首字母转大写（同 <code>^</code>）<a href="https://pemako.github.io/blog/parameter-expansion#parameteru--%E9%A6%96%E5%AD%97%E6%AF%8D%E8%BD%AC%E5%A4%A7%E5%86%99%E5%90%8C-" class="hash-link" aria-label="parameteru--首字母转大写同-的直接链接" title="parameteru--首字母转大写同-的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str@u}             # 输出: Hello world</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameterl--转小写同-"><code>${parameter@L}</code> — 转小写（同 <code>,,</code>）<a href="https://pemako.github.io/blog/parameter-expansion#parameterl--%E8%BD%AC%E5%B0%8F%E5%86%99%E5%90%8C-" class="hash-link" aria-label="parameterl--转小写同-的直接链接" title="parameterl--转小写同-的直接链接" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="HELLO WORLD"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str@L}             # 输出: hello world</span><br></div></code></pre></div></div>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameterq--引号安全转义shell-可重用格式"><code>${parameter@Q}</code> — 引号安全转义（Shell 可重用格式）<a href="https://pemako.github.io/blog/parameter-expansion#parameterq--%E5%BC%95%E5%8F%B7%E5%AE%89%E5%85%A8%E8%BD%AC%E4%B9%89shell-%E5%8F%AF%E9%87%8D%E7%94%A8%E6%A0%BC%E5%BC%8F" class="hash-link" aria-label="parameterq--引号安全转义shell-可重用格式的直接链接" title="parameterq--引号安全转义shell-可重用格式的直接链接" translate="no">​</a></h4>
<p><strong>规则：</strong> 将值转为带引号的格式，使其可以安全地被 shell 重新解析。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str="hello world"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str@Q}             # 输出: 'hello world'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str2="it's a test"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str2@Q}            # 输出: 'it'\''s a test'  或 $'it\'s a test'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">path="/home/user/my docs"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${path@Q}            # 输出: '/home/user/my docs'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 实用：调试时安全打印变量</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -p var            # 等效于用 @Q 打印</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 生成可重用的赋值语句</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name="Alice O'Brien"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "name=${name@Q}"     # 输出: name='Alice O'\''Brien'</span><br></div></code></pre></div></div>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parametere--转义序列展开类似-"><code>${parameter@E}</code> — 转义序列展开（类似 <code>$'...'</code>）<a href="https://pemako.github.io/blog/parameter-expansion#parametere--%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97%E5%B1%95%E5%BC%80%E7%B1%BB%E4%BC%BC-" class="hash-link" aria-label="parametere--转义序列展开类似-的直接链接" title="parametere--转义序列展开类似-的直接链接" translate="no">​</a></h4>
<p><strong>规则：</strong> 将字符串中的转义序列（<code>\n</code>, <code>\t</code>, <code>\xHH</code> 等）展开为实际字符。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">str='Hello\nWorld'        # 单引号，\n 未展开</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str@E}             # 输出: Hello</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                          #       World     （\n 被展开为换行）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">str2='Column1\tColumn2'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${str2@E}            # 输出: Column1	Column2   （\t 展开为制表符）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hex='\x41\x42\x43'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${hex@E}             # 输出: ABC        （十六进制展开）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 与 $'...' 等效</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo $'Hello\nWorld'      # 同上效果</span><br></div></code></pre></div></div>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parameterp--按提示符格式展开"><code>${parameter@P}</code> — 按提示符格式展开<a href="https://pemako.github.io/blog/parameter-expansion#parameterp--%E6%8C%89%E6%8F%90%E7%A4%BA%E7%AC%A6%E6%A0%BC%E5%BC%8F%E5%B1%95%E5%BC%80" class="hash-link" aria-label="parameterp--按提示符格式展开的直接链接" title="parameterp--按提示符格式展开的直接链接" translate="no">​</a></h4>
<p><strong>规则：</strong> 将 <code>parameter</code> 的值按 PS1 提示符格式（<code>\u</code>, <code>\h</code>, <code>\w</code> 等）展开。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># 模拟提示符展开</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">template='\u@\h:\w\$'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${template@P}        # 输出: alice@myhost:/home/alice/projects$</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 调试 PS1 展开结果</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${PS1@P}             # 输出当前提示符的实际显示内容</span><br></div></code></pre></div></div>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parametera--生成赋值语句"><code>${parameter@A}</code> — 生成赋值语句<a href="https://pemako.github.io/blog/parameter-expansion#parametera--%E7%94%9F%E6%88%90%E8%B5%8B%E5%80%BC%E8%AF%AD%E5%8F%A5" class="hash-link" aria-label="parametera--生成赋值语句的直接链接" title="parametera--生成赋值语句的直接链接" translate="no">​</a></h4>
<p><strong>规则：</strong> 展开为可重现变量赋值的 <code>declare</code> 语句（包含属性和值）。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">name="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name@A}            # 输出: declare -- name="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -r PI=3.14</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${PI@A}              # 输出: declare -r PI="3.14"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -i count=42</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${count@A}           # 输出: declare -i count="42"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -a arr=(1 2 3)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr@A}             # 输出: declare -a arr=([0]="1" [1]="2" [2]="3")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -A map=([a]=1 [b]=2)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${map@A}             # 输出: declare -A map=([a]="1" [b]="2")</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># 实用：序列化变量（用于 eval 恢复）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">backup="${arr@A}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">unset arr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eval "$backup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr[@]}            # 输出: 1 2 3  （已恢复）</span><br></div></code></pre></div></div>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="parametera--显示变量属性标志"><code>${parameter@a}</code> — 显示变量属性标志<a href="https://pemako.github.io/blog/parameter-expansion#parametera--%E6%98%BE%E7%A4%BA%E5%8F%98%E9%87%8F%E5%B1%9E%E6%80%A7%E6%A0%87%E5%BF%97" class="hash-link" aria-label="parametera--显示变量属性标志的直接链接" title="parametera--显示变量属性标志的直接链接" translate="no">​</a></h4>
<p><strong>规则：</strong> 展开为 <code>declare</code> 属性标志字母（<code>r</code>=只读, <code>i</code>=整数, <code>a</code>=数组, <code>A</code>=关联数组, <code>x</code>=export 等）。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">declare -r PI=3.14</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${PI@a}              # 输出: r    （只读）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -i num=10</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${num@a}             # 输出: i    （整数）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -rx LOG_LEVEL="info"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${LOG_LEVEL@a}       # 输出: rx   （只读 + export）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -a arr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${arr@a}             # 输出: a    （索引数组）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">declare -A map</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${map@a}             # 输出: A    （关联数组）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">name="Alice"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo ${name@a}            # 输出:      （普通变量，无属性）</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结记忆规则">总结：记忆规则<a href="https://pemako.github.io/blog/parameter-expansion#%E6%80%BB%E7%BB%93%E8%AE%B0%E5%BF%86%E8%A7%84%E5%88%99" class="hash-link" aria-label="总结：记忆规则的直接链接" title="总结：记忆规则的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="一冒号系列----">一、冒号系列（<code>-</code> <code>=</code> <code>?</code> <code>+</code>）<a href="https://pemako.github.io/blog/parameter-expansion#%E4%B8%80%E5%86%92%E5%8F%B7%E7%B3%BB%E5%88%97----" class="hash-link" aria-label="一冒号系列----的直接链接" title="一冒号系列----的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">操作符    有值时      无值/空时       记忆口诀</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -       原值        用word         「减」法兜底：没有就用默认值</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  =       原值        赋word给变量   「等」于赋值：没有就赋上去</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ?       原值        报错退出       「问」号追责：没有就报错</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  +       word        空字符串       「加」法反转：有了才替换</span><br></div></code></pre></div></div>
<p><strong>反向逻辑记忆：<code>:-</code> 和 <code>:+</code> 互为反义：</strong></p>
<ul>
<li class=""><code>:-</code> → 没有时用 word（兜底）</li>
<li class=""><code>:+</code> → 有值时用 word（替换）</li>
</ul>
<p><strong>冒号的作用：</strong></p>
<ul>
<li class="">有 <code>:</code> → 同时检查 <strong>unset</strong> 和 <strong>空字符串</strong></li>
<li class="">无 <code>:</code> → 只检查 <strong>unset</strong></li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="二---删除模式">二、<code>#</code> / <code>%</code> 删除模式<a href="https://pemako.github.io/blog/parameter-expansion#%E4%BA%8C---%E5%88%A0%E9%99%A4%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="二---删除模式的直接链接" title="二---删除模式的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">方向      单符号(#/%)   双符号(##/%%)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">开头(#)   最短匹配删除   最长匹配删除</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">结尾(%)   最短匹配删除   最长匹配删除</span><br></div></code></pre></div></div>
<p><strong>联想记忆：</strong></p>
<ul>
<li class=""><code>#</code> 在键盘上是 <code>Shift+3</code>，<strong>3 在 1 的右边</strong> → 从<strong>左/前</strong>开始</li>
<li class=""><code>%</code> 在键盘上是 <code>Shift+5</code>，<strong>5 在 1 的右边更远</strong> → 从<strong>右/后</strong>开始</li>
<li class="">或记：<code>#</code> 是注释符，注释写在<strong>前面</strong> → 删<strong>前缀</strong>；<code>%</code> 是取模，通常在末尾 → 删<strong>后缀</strong></li>
<li class="">单符号 = 贪心停止（最短），双符号 = 贪心到底（最长）</li>
</ul>
<p><strong>实用口诀：</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">${file##*/}   # 取文件名（删掉最长前缀路径）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${file%.*}    # 去扩展名（删掉最短后缀）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${file##*.}   # 取扩展名（删掉最长前缀到点）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${path%/*}    # 取目录名（删掉最短后缀文件名）</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="三替换系列">三、替换系列（<code>/</code>）<a href="https://pemako.github.io/blog/parameter-expansion#%E4%B8%89%E6%9B%BF%E6%8D%A2%E7%B3%BB%E5%88%97" class="hash-link" aria-label="三替换系列的直接链接" title="三替换系列的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">${var/pat/str}    替换第一个    → 单斜杠，一次</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var//pat/str}   替换全部      → 双斜杠，所有</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var/#pat/str}   替换开头      → # 锚定开头（同正则 ^）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var/%pat/str}   替换结尾      → % 锚定结尾（同正则 $）</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="四大小写系列">四、大小写系列<a href="https://pemako.github.io/blog/parameter-expansion#%E5%9B%9B%E5%A4%A7%E5%B0%8F%E5%86%99%E7%B3%BB%E5%88%97" class="hash-link" aria-label="四、大小写系列的直接链接" title="四、大小写系列的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">^ 朝上  = 大写     , 朝下  = 小写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">单符号  = 第一个   双符号  = 全部</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var^}    首字母大写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var^^}   全部大写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var,}    首字母小写</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${var,,}   全部小写</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="五-操作符速查表">五、<code>@</code> 操作符速查表<a href="https://pemako.github.io/blog/parameter-expansion#%E4%BA%94-%E6%93%8D%E4%BD%9C%E7%AC%A6%E9%80%9F%E6%9F%A5%E8%A1%A8" class="hash-link" aria-label="五-操作符速查表的直接链接" title="五-操作符速查表的直接链接" translate="no">​</a></h3>


















































<table><thead><tr><th>操作符</th><th>功能</th><th>记忆联想</th></tr></thead><tbody><tr><td><code>@Q</code></td><td>带引号转义</td><td>Q = Quote</td></tr><tr><td><code>@E</code></td><td>展开转义序列</td><td>E = Escape / Expand</td></tr><tr><td><code>@P</code></td><td>按提示符格式展开</td><td>P = Prompt</td></tr><tr><td><code>@A</code></td><td>生成 declare 语句</td><td>A = Assignment</td></tr><tr><td><code>@a</code></td><td>显示属性标志</td><td>a = attributes（小写）</td></tr><tr><td><code>@U</code></td><td>全部大写</td><td>U = Uppercase</td></tr><tr><td><code>@u</code></td><td>首字母大写</td><td>u = uppercase（首个）</td></tr><tr><td><code>@L</code></td><td>全部小写</td><td>L = Lowercase</td></tr></tbody></table>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="六-间接引用速查">六、<code>!</code> 间接引用速查<a href="https://pemako.github.io/blog/parameter-expansion#%E5%85%AD-%E9%97%B4%E6%8E%A5%E5%BC%95%E7%94%A8%E9%80%9F%E6%9F%A5" class="hash-link" aria-label="六-间接引用速查的直接链接" title="六-间接引用速查的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">${!prefix@}    列出变量名（@ 版本，引号安全）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${!prefix*}    列出变量名（* 版本，合并为一串）</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${!arr[@]}     数组所有下标/键</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">${!var}        间接引用：展开 $var，再用其值作为变量名</span><br></div></code></pre></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="七综合记忆口诀">七、综合记忆口诀<a href="https://pemako.github.io/blog/parameter-expansion#%E4%B8%83%E7%BB%BC%E5%90%88%E8%AE%B0%E5%BF%86%E5%8F%A3%E8%AF%80" class="hash-link" aria-label="七、综合记忆口诀的直接链接" title="七、综合记忆口诀的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">冒号系列：- 兜底，= 赋值，? 报错，+ 反转</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">井号删前缀，百分删后缀，单符最短双最长</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">斜杠替换首，双杠替全部，井锚头百锚尾</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">帽子变大写，逗号变小写，单个首双全部</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">At符号变形：Q引E转P提示，A赋值a属性UuL大小写</span><br></div></code></pre></div></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Welcome]]></title>
            <link>https://pemako.github.io/blog/welcome</link>
            <guid>https://pemako.github.io/blog/welcome</guid>
            <pubDate>Thu, 26 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Docusaurus blogging features are powered by the blog plugin.]]></description>
            <content:encoded><![CDATA[<p><a href="https://docusaurus.io/docs/blog" target="_blank" rel="noopener noreferrer" class="">Docusaurus blogging features</a> are powered by the <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog" target="_blank" rel="noopener noreferrer" class="">blog plugin</a>.</p>
<p>Here are a few tips you might find useful.</p>
<!-- -->
<p>Simply add Markdown files (or folders) to the <code>blog</code> directory.</p>
<p>Regular blog authors can be added to <code>authors.yml</code>.</p>
<p>The blog post date can be extracted from filenames, such as:</p>
<ul>
<li class=""><code>2019-05-30-welcome.md</code></li>
<li class=""><code>2019-05-30-welcome/index.md</code></li>
</ul>
<p>A blog post folder can be convenient to co-locate blog post images:</p>
<p><img decoding="async" loading="lazy" alt="Docusaurus Plushie" src="https://pemako.github.io/assets/images/docusaurus-plushie-banner-a60f7593abca1e3eef26a9afa244e4fb.jpeg" width="1500" height="500" class="img_ev3q"></p>
<p>The blog supports tags as well!</p>
<p><strong>And if you don't want a blog</strong>: just delete this directory, and use <code>blog: false</code> in your Docusaurus config.</p>]]></content:encoded>
            <category>Facebook</category>
            <category>Hello</category>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[MDX Blog Post]]></title>
            <link>https://pemako.github.io/blog/mdx-blog-post</link>
            <guid>https://pemako.github.io/blog/mdx-blog-post</guid>
            <pubDate>Sun, 01 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Blog posts support Docusaurus Markdown features, such as MDX.]]></description>
            <content:encoded><![CDATA[<p>Blog posts support <a href="https://docusaurus.io/docs/markdown-features" target="_blank" rel="noopener noreferrer" class="">Docusaurus Markdown features</a>, such as <a href="https://mdxjs.com/" target="_blank" rel="noopener noreferrer" class="">MDX</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>提示</div><div class="admonitionContent_BuS1"><p>Use the power of React to create interactive blog posts.</p></div></div>
<!-- -->
<p>For example, use JSX to create an interactive button:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">button onClick</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">alert</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'button clicked!'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token maybe-class-name">Click</span><span class="token plain"> me</span><span class="token operator" style="color:#393A34">!</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">button</span><span class="token operator" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<button>Click me!</button>]]></content:encoded>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[Long Blog Post]]></title>
            <link>https://pemako.github.io/blog/long-blog-post</link>
            <guid>https://pemako.github.io/blog/long-blog-post</guid>
            <pubDate>Wed, 29 May 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[This is the summary of a very long blog post,]]></description>
            <content:encoded><![CDATA[<p>This is the summary of a very long blog post,</p>
<p>Use a <code>{/*</code> <code>truncate</code> <code>*/}</code> comment to limit blog post size in the list view.</p>
<!-- -->
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>]]></content:encoded>
            <category>Hello</category>
            <category>Docusaurus</category>
        </item>
        <item>
            <title><![CDATA[First Blog Post]]></title>
            <link>https://pemako.github.io/blog/first-blog-post</link>
            <guid>https://pemako.github.io/blog/first-blog-post</guid>
            <pubDate>Tue, 28 May 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Lorem ipsum dolor sit amet...]]></description>
            <content:encoded><![CDATA[<p>Lorem ipsum dolor sit amet...</p>
<!-- -->
<p>...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet</p>]]></content:encoded>
            <category>Hola</category>
            <category>Docusaurus</category>
        </item>
    </channel>
</rss>