<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>秦大炮的博客</title><link>https://qindapao.com/</link><description>专注技术分享与算法演示的个人独立博客。我是 ASCII 艺术家，擅长运用 ASCII 艺术来直观展示系统架构与核心算法。</description><generator>Hugo 0.163.2 &amp; FixIt v0.4.5</generator><language>zh-cn</language><managingEditor>northisland2017@gmail.com (秦大炮)</managingEditor><webMaster>northisland2017@gmail.com (秦大炮)</webMaster><lastBuildDate>Thu, 18 Jun 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://qindapao.com/index.xml" rel="self" type="application/rss+xml"/><item><title>shell中的原生字符串处理方法</title><link>https://qindapao.com/posts/software/shell/shell_string/</link><pubDate>Thu, 18 Jun 2026 12:00:00 +0800</pubDate><author>northisland2017@gmail.com (秦大炮)</author><guid>https://qindapao.com/posts/software/shell/shell_string/</guid><category domain="https://qindapao.com/categories/%E8%BD%AF%E4%BB%B6%E6%8A%80%E6%9C%AF/">软件技术</category><description>&lt;h2 class="heading-element" id="前言"&gt;&lt;span&gt;前言&lt;/span&gt;
 &lt;a href="#%e5%89%8d%e8%a8%80" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;Linux Shell（Bash）提供了强大的原生字符串处理能力，主要依赖内置的参数扩展（Parameter Expansion）语法，无需调用 awk、sed 等外部工具，由于在bash的内部执行，不需要fork外部程序，执行效率高。&lt;/p&gt;
&lt;h2 class="heading-element" id="具体方法"&gt;&lt;span&gt;具体方法&lt;/span&gt;
 &lt;a href="#%e5%85%b7%e4%bd%93%e6%96%b9%e6%b3%95" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;测试使用的变量为: &lt;code&gt;str=&amp;quot;Hello, Shell World!&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;h3 class="heading-element" id="获取长度"&gt;&lt;span&gt;获取长度&lt;/span&gt;
 &lt;a href="#%e8%8e%b7%e5%8f%96%e9%95%bf%e5%ba%a6" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;${#variable}&lt;/code&gt; 语法获取字符串的字符串。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;echo ${#str} # 输出: 19&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果当前的环境的语言配置是正确的，那么可以正确识别&lt;code&gt;unicode&lt;/code&gt;字符，比如中文，会正确按照字符的个数输出。&lt;/p&gt;
&lt;h3 class="heading-element" id="截取子串"&gt;&lt;span&gt;截取子串&lt;/span&gt;
 &lt;a href="#%e6%88%aa%e5%8f%96%e5%ad%90%e4%b8%b2" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;${variable:start:length}&lt;/code&gt; 语法(基于索引截取，从0开始)。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 从索引 7 开始截取 5 个字符
echo ${str:7:5} # 输出: Shell

# 从索引 7 开始一直截取到末尾
echo ${str:7} # 输出: Shell World!

# 从右边倒数第 6 个字符开始截取
echo ${str: -6} # 输出: World! (注意冒号和负号之间必须有空格)&lt;/code&gt;&lt;/pre&gt;&lt;h3 class="heading-element" id="匹配删除"&gt;&lt;span&gt;匹配删除&lt;/span&gt;
 &lt;a href="#%e5%8c%b9%e9%85%8d%e5%88%a0%e9%99%a4" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;#&lt;/code&gt; 和 &lt;code&gt;%&lt;/code&gt; 符号，通过模式匹配来删除字符串的一部分。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最短匹配删除（非贪婪模式）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#&lt;/code&gt; 删除左侧匹配内容：&lt;code&gt;echo ${str#*o}&lt;/code&gt; （删除第一个 &lt;code&gt;o&lt;/code&gt; 及左侧字符 -&amp;gt; &lt;code&gt;, Shell World!&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%&lt;/code&gt; 删除右侧匹配内容：&lt;code&gt;echo ${str%o*}&lt;/code&gt; （删除最后一个 &lt;code&gt;o&lt;/code&gt; 及右侧字符 -&amp;gt; &lt;code&gt;Hello, Shell W&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最长匹配删除（贪婪模式）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;##&lt;/code&gt; 删除左侧最长匹配：&lt;code&gt;echo ${str##*o}&lt;/code&gt; （删除最后一个 &lt;code&gt;o&lt;/code&gt; 及左侧字符 -&amp;gt; &lt;code&gt;rld!&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%%&lt;/code&gt; 删除右侧最长匹配：&lt;code&gt;echo ${str%%o*}&lt;/code&gt; （删除第一个 &lt;code&gt;o&lt;/code&gt; 及右侧字符 -&amp;gt; &lt;code&gt;Hell&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在上面的匹配模式中，&lt;code&gt;*&lt;/code&gt; 号表示任意字符，还有别的符号可选，比如：&lt;code&gt;?&lt;/code&gt; 表示任意一个字符。&lt;/p&gt;
&lt;h3 class="heading-element" id="查找与替换"&gt;&lt;span&gt;查找与替换&lt;/span&gt;
 &lt;a href="#%e6%9f%a5%e6%89%be%e4%b8%8e%e6%9b%bf%e6%8d%a2" class="heading-mark"&gt;
 &lt;svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"&gt;&lt;path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"&gt;&lt;/path&gt;&lt;/svg&gt;
 &lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;${variable/pattern/string}&lt;/code&gt; 语法，默认只替换一次，双斜杠 &lt;code&gt;//&lt;/code&gt; 替换所有。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 将第一个 World 替换为 Linux
echo ${str/World/Linux} # 输出: Hello, Shell Linux!

# 将所有的 l 替换为大写的 L
echo ${str//l/L} # 输出: HeLLo, SheLL WorLd!&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>你好，世界！</title><link>https://qindapao.com/posts/welcome/</link><pubDate>Wed, 17 Jun 2026 12:00:00 +0800</pubDate><author>northisland2017@gmail.com (秦大炮)</author><guid>https://qindapao.com/posts/welcome/</guid><category domain="https://qindapao.com/categories/%E6%9C%AA%E5%88%86%E7%B1%BB/">未分类</category><description>&lt;p&gt;这是&lt;strong&gt;秦大炮的博客&lt;/strong&gt;第一篇文章！&lt;/p&gt;
&lt;p&gt;欢迎来到我的独立空间。在这里，我将会分享：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💻 一些生活的碎碎念。&lt;/li&gt;
&lt;li&gt;📊 一些算法或者是技术原理的动态视觉演示，一般情况下采用 ASCII 艺术的方式！&lt;/li&gt;
&lt;li&gt;💡 个人独立思考与心得分享&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;感谢你的关注！&lt;/p&gt;</description></item></channel></rss>