<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>北海虽赊，扶摇可接</title>
        <subtitle>「 勇敢者是到处有路可走的 」</subtitle>
        <icon>https://metal-heart.github.io/images/favicon.ico</icon>
        <link>https://Metal-Heart.github.io</link>
        <author>
          <name>Metal-Heart</name>
        </author>
        <description>老实是人生绝妙的法宝。虽然对人老实，你可能付出一定的代价，但日后你得到的，远比付出的多得多。</description>
        <language>zh-CN</language>
        <pubDate>Thu, 06 Apr 2023 09:56:48 +0800</pubDate>
        <lastBuildDate>Thu, 06 Apr 2023 09:56:48 +0800</lastBuildDate>
        <category term="硬件" />
        <category term="单片机" />
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/fe37bc01/</guid>
            <title>博客同步</title>
            <link>https://metal-heart.github.io/posts/fe37bc01/</link>
            <category term="微信" scheme="https://metal-heart.github.io/categories/%E5%BE%AE%E4%BF%A1/" />
            <category term="腾讯云" scheme="https://metal-heart.github.io/categories/%E5%BE%AE%E4%BF%A1/%E8%85%BE%E8%AE%AF%E4%BA%91/" />
            <category term="腾讯云" scheme="https://metal-heart.github.io/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/" />
            <pubDate>Thu, 06 Apr 2023 09:56:48 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;博客同步&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#博客同步&#34;&gt;#&lt;/a&gt; 博客同步&lt;/h1&gt;
&lt;p&gt;我的博客即将同步至腾讯云开发者社区，&lt;br /&gt;
邀请大家一同入驻：&lt;br /&gt;
&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kZXZlbG9wZXIvc3VwcG9ydC1wbGFuP2ludml0ZV9jb2RlPTJxbmN5eHZsaW8wMGc=&#34;&gt;https://cloud.tencent.com/developer/support-plan?invite_code=2qncyxvlio00g&lt;/span&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/fe37bc01/</guid>
            <title>博客同步</title>
            <link>https://metal-heart.github.io/posts/fe37bc01/</link>
            <category term="微信" scheme="https://metal-heart.github.io/categories/%E5%BE%AE%E4%BF%A1/" />
            <category term="腾讯云" scheme="https://metal-heart.github.io/categories/%E5%BE%AE%E4%BF%A1/%E8%85%BE%E8%AE%AF%E4%BA%91/" />
            <category term="腾讯云" scheme="https://metal-heart.github.io/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/" />
            <pubDate>Thu, 06 Apr 2023 09:56:48 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;博客同步&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#博客同步&#34;&gt;#&lt;/a&gt; 博客同步&lt;/h1&gt;
&lt;p&gt;我的博客即将同步至腾讯云开发者社区，&lt;br /&gt;
邀请大家一同入驻：&lt;br /&gt;
&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kZXZlbG9wZXIvc3VwcG9ydC1wbGFuP2ludml0ZV9jb2RlPTJxbmN5eHZsaW8wMGc=&#34;&gt;https://cloud.tencent.com/developer/support-plan?invite_code=2qncyxvlio00g&lt;/span&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/816f699b/</guid>
            <title>EMC知识总结</title>
            <link>https://metal-heart.github.io/posts/816f699b/</link>
            <category term="硬件设计" scheme="https://metal-heart.github.io/categories/Hardware/" />
            <category term="EMC" scheme="https://metal-heart.github.io/categories/Hardware/EMC/" />
            <category term="硬件设计" scheme="https://metal-heart.github.io/tags/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/" />
            <category term="EMC" scheme="https://metal-heart.github.io/tags/EMC/" />
            <pubDate>Thu, 12 Jan 2023 11:08:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;img data-src=&#34;https://pic1.zhimg.com/80/v2-2b79b6ec485d9ed67351fcc00e5bf5a0_720w.webp&#34; alt=&#34;&#34; /&gt;&lt;br /&gt;
&lt;img data-src=&#34;https://pic3.zhimg.com/80/v2-651b044546319ca6725e50423af4f92a_720w.webp&#34; alt=&#34;&#34; /&gt;&lt;br /&gt;
&lt;img data-src=&#34;https://pic3.zhimg.com/80/v2-b17d79d71b2666f0bb36a45ca6e4607a_720w.webp&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h1 id=&#34;附录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#附录&#34;&gt;#&lt;/a&gt; 附录：&lt;/h1&gt;
&lt;p&gt;附录：家电产品 EMC 标准 / 测试方法汇总&lt;br /&gt;
 EN/IEC 55014-1：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus - Part 1: Emission 家用电器、电动工具及类似器具的电磁兼容发射骚扰要求&lt;/p&gt;
&lt;p&gt;EN/IEC 55014-2：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus Part 2: Immunity 家用电器、电动工具及类似器具的电磁兼容抗扰度要求&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-3-2：Electromagnetic compatibility (EMC) Part 3-2: Limits - Limits for harmonic current emissions (equipment input current ≤ 16 A per phase) 低压电气及电子设备发出的谐波电流限值（单项输入电流不大于 16A）&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-3-3：Electromagnetic compatibility (EMC) – Part 3-3: Limits – Limitation of voltage changes, voltage fluctuations and flicker in public low-voltage supply systems, for equipment with rated current ≤ 16 A per phase and not subject to conditional connection 输入电流不大于 16A 的低压供电系统电压波动和闪烁测试&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-4-2：Electromagnetic compatibility (EMC) Part 4-2: Testing and measurement techniques - Electrostatic discharge immunity test ESD 静电放电抗扰&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-4-3：Electromagnetic compatibility (EMC) Part 4-3: Testing and measurement techniques — Radiated, radio-frequency, electromagnetic field immunity test 辐射，射频，电磁场抗扰度&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-4-4：Electromagnetic compatibility (EMC) Part 4-4: Testing and measurement techniques - Electrical fast transient/burst immunity test ETF 电瞬变脉冲群抗扰度&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-4-5：Electromagnetic compatibility (EMC) - Part 4-5: Testing and measurement techniques - Surge immunity test 浪涌抗扰度&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-4-6：Electromagnetic compatibility (EMC) - Part 4-6: Testing and measurement techniques - Immunity to conducted disturbances, induced by radio-frequency fields 射频场引起的传导干扰的抗扰度&lt;/p&gt;
&lt;p&gt;EN/IEC 61000-4-11：Electromagnetic compatibility (EMC) Part 4-11: Testing and measurement techniques - Voltage dips, short interruptions and voltage variations immunity tests for equipment with input current up to 16 A per phase 电压暂降，短时中断和电压变化抗扰度&lt;/p&gt;
&lt;p&gt;CISPR 14-1：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus - Part 1: Emission 家用电器、电动工具及类似器具的电磁兼容发射骚扰要求&lt;/p&gt;
&lt;p&gt;CISPR 14-2：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus Part 2: Immunity 家用电器、电动工具及类似器具的电磁兼容抗扰度要求&lt;/p&gt;
&lt;p&gt;CFR title 47 part 15：Radio Frequency Devices 无线电频率设备&lt;/p&gt;
&lt;p&gt;ICES-003：Information Technology Equipment (including Digital Apparatus) 信息技术设备（包括数字仪器）&lt;/p&gt;
&lt;p&gt;AS/NZS CISPR 14.1：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus - Part 1: Emission 家用电器、电动工具及类似器具的电磁兼容发射骚扰要求&lt;/p&gt;
&lt;p&gt;GB 4343.1：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus - Part 1: Emission 家用电器、电动工具及类似器具的电磁兼容发射骚扰要求&lt;/p&gt;
&lt;p&gt;GB 4343.2：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus Part 2: Immunity 家用电器、电动工具及类似器具的电磁兼容抗扰度要求&lt;/p&gt;
&lt;p&gt;KN 14-1：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus - Part 1: Emission 家用电器、电动工具及类似器具的电磁兼容发射骚扰要求&lt;/p&gt;
&lt;p&gt;KN 14-2：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus Part 2: Immunity 家用电器、电动工具及类似器具的电磁兼容抗扰度要求&lt;/p&gt;
&lt;p&gt;J55014-1 (H27)：Electromagnetic compatibility - Requirements for household appliances, electric tools and similar apparatus - Part 1: Emission 家用电器、电动工具及类似器具的电磁兼容发射骚扰要求&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/41049874/</guid>
            <title>一篇文章让你彻底掌握 Shell</title>
            <link>https://metal-heart.github.io/posts/41049874/</link>
            <category term="工具" scheme="https://metal-heart.github.io/categories/Tool/" />
            <category term="Linux" scheme="https://metal-heart.github.io/categories/Tool/Linux/" />
            <category term="编程语言" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/" />
            <category term="编程" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B/" />
            <category term="shell" scheme="https://metal-heart.github.io/tags/shell/" />
            <pubDate>Thu, 17 Nov 2022 18:16:00 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;一篇文章让你彻底掌握-shell&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#一篇文章让你彻底掌握-shell&#34;&gt;#&lt;/a&gt; 一篇文章让你彻底掌握 Shell&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;由于 bash 是 Linux 标准默认的 shell 解释器，可以说 bash 是 shell 编程的基础。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;本文主要介绍 bash 的语法，对于 linux 指令不做任何介绍&lt;/em&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;███████╗██╗  ██╗███████╗██╗     ██╗
██╔════╝██║  ██║██╔════╝██║     ██║
███████╗███████║█████╗  ██║     ██║
╚════██║██╔══██║██╔══╝  ██║     ██║
███████║██║  ██║███████╗███████╗███████╗
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;简介&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#简介&#34;&gt;#&lt;/a&gt; 简介&lt;/h2&gt;
&lt;h3 id=&#34;什么是-shell&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#什么是-shell&#34;&gt;#&lt;/a&gt; 什么是 shell&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Shell 是一个用 C 语言编写的程序，它是用户使用 Linux 的桥梁。&lt;/li&gt;
&lt;li&gt;Shell 既是一种命令语言，又是一种程序设计语言。&lt;/li&gt;
&lt;li&gt;Shell 是指一种应用程序，这个应用程序提供了一个界面，用户通过这个界面访问 Linux 内核的服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ken Thompson 的 sh 是第一种 Unix Shell，Windows Explorer 是一个典型的图形界面 Shell。&lt;/p&gt;
&lt;h3 id=&#34;什么是-shell-脚本&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#什么是-shell-脚本&#34;&gt;#&lt;/a&gt; 什么是 shell 脚本&lt;/h3&gt;
&lt;p&gt;Shell 脚本（shell script），是一种为 shell 编写的脚本程序，一般文件后缀为  &lt;code&gt;.sh&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;业界所说的 shell 通常都是指 shell 脚本，但 shell 和 shell script 是两个不同的概念。&lt;/p&gt;
&lt;h3 id=&#34;shell-环境&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#shell-环境&#34;&gt;#&lt;/a&gt; Shell 环境&lt;/h3&gt;
&lt;p&gt;Shell 编程跟 java、php 编程一样，只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。&lt;/p&gt;
&lt;p&gt;Shell 的解释器种类众多，常见的有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoLw==&#34;&gt;sh&lt;/span&gt; - 即 Bourne Shell。sh 是 Unix 标准默认的 shell。&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoLw==&#34;&gt;bash&lt;/span&gt; - 即 Bourne Again Shell。bash 是 Linux 标准默认的 shell。&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9maXNoc2hlbGwuY29tLw==&#34;&gt;fish&lt;/span&gt; - 智能和用户友好的命令行 shell。&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3hpa2kub3JnLw==&#34;&gt;xiki&lt;/span&gt; - 使 shell 控制台更友好，更强大。&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy56c2gub3JnLw==&#34;&gt;zsh&lt;/span&gt; - 功能强大的 shell 与脚本语言。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;指定脚本解释器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#指定脚本解释器&#34;&gt;#&lt;/a&gt; 指定脚本解释器&lt;/h4&gt;
&lt;p&gt;在 shell 脚本， &lt;code&gt;#!&lt;/code&gt;  告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。 &lt;code&gt;#!&lt;/code&gt;  被称作&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly96aC53aWtpcGVkaWEub3JnL3dpa2kvU2hlYmFuZw==&#34;&gt; shebang（也称为 Hashbang ）&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;所以，你应该会在 shell 中，见到诸如以下的注释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指定 sh 解释器&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/bin/sh&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul&gt;
&lt;li&gt;指定 bash 解释器&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/bin/bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上面的指定解释器的方式是比较常见的，但有时候，你可能也会看到下面的方式：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;这样做的好处是，系统会自动在  &lt;code&gt;PATH&lt;/code&gt;  环境变量中查找你指定的程序（本例中的 &lt;code&gt;bash&lt;/code&gt; ）。相比第一种写法，你应该尽量用这种写法，因为程序的路径是不确定的。这样写还有一个好处，操作系统的 &lt;code&gt;PATH&lt;/code&gt;  变量有可能被配置为指向程序的另一个版本。比如，安装完新版本的 &lt;code&gt;bash&lt;/code&gt; ，我们可能将其路径添加到 &lt;code&gt;PATH&lt;/code&gt;  中，来 “隐藏” 老版本。如果直接用 &lt;code&gt;#!/bin/bash&lt;/code&gt; ，那么系统会选择老版本的 &lt;code&gt;bash&lt;/code&gt;  来执行脚本，如果用 &lt;code&gt;#!/usr/bin/env bash&lt;/code&gt; ，则会使用新版本。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;模式&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#模式&#34;&gt;#&lt;/a&gt; 模式&lt;/h3&gt;
&lt;p&gt;shell 有交互和非交互两种模式。&lt;/p&gt;
&lt;h4 id=&#34;交互模式&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#交互模式&#34;&gt;#&lt;/a&gt; 交互模式&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;简单来说，你可以将 shell 的交互模式理解为执行命令行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;看到形如下面的东西，说明 shell 处于交互模式下：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;user@host:~$&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;接着，便可以输入一系列 Linux 命令，比如  &lt;code&gt;ls&lt;/code&gt; ， &lt;code&gt;grep&lt;/code&gt; ， &lt;code&gt;cd&lt;/code&gt; ， &lt;code&gt;mkdir&lt;/code&gt; ， &lt;code&gt;rm&lt;/code&gt;  等等。&lt;/p&gt;
&lt;h4 id=&#34;非交互模式&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#非交互模式&#34;&gt;#&lt;/a&gt; 非交互模式&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;简单来说，你可以将 shell 的非交互模式理解为执行 shell 脚本。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在非交互模式下，shell 从文件或者管道中读取命令并执行。&lt;/p&gt;
&lt;p&gt;当 shell 解释器执行完文件中的最后一个命令，shell 进程终止，并回到父进程。&lt;/p&gt;
&lt;p&gt;可以使用下面的命令让 shell 以非交互模式运行：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sh&lt;/span&gt; /path/to/script.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;bash&lt;/span&gt; /path/to/script.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;source&lt;/span&gt; /path/to/script.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;./path/to/script.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;上面的例子中， &lt;code&gt;script.sh&lt;/code&gt;  是一个包含 shell 解释器可以识别并执行的命令的普通文本文件， &lt;code&gt;sh&lt;/code&gt;  和 &lt;code&gt;bash&lt;/code&gt;  是 shell 解释器程序。你可以使用任何喜欢的编辑器创建 &lt;code&gt;script.sh&lt;/code&gt; （vim，nano，Sublime Text, Atom 等等）。&lt;/p&gt;
&lt;p&gt;其中， &lt;code&gt;source /path/to/script.sh&lt;/code&gt;  和  &lt;code&gt;./path/to/script.sh&lt;/code&gt;  是等价的。&lt;/p&gt;
&lt;p&gt;除此之外，你还可以通过 &lt;code&gt;chmod&lt;/code&gt;  命令给文件添加可执行的权限，来直接执行脚本文件：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;chmod&lt;/span&gt; +x /path/to/script.sh &lt;span class=&#34;token comment&#34;&gt;#使脚本具有执行权限&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;/path/to/test.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;这种方式要求脚本文件的第一行必须指明运行该脚本的程序，比如：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Hello, world!&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;上面的例子中，我们使用了一个很有用的命令 &lt;code&gt;echo&lt;/code&gt;  来输出字符串到屏幕上。&lt;/p&gt;
&lt;h2 id=&#34;基本语法&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#基本语法&#34;&gt;#&lt;/a&gt; 基本语法&lt;/h2&gt;
&lt;h3 id=&#34;解释器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#解释器&#34;&gt;#&lt;/a&gt; 解释器&lt;/h3&gt;
&lt;p&gt;前面虽然两次提到了 &lt;code&gt;#!&lt;/code&gt;  ，但是本着重要的事情说三遍的精神，这里再强调一遍：&lt;/p&gt;
&lt;p&gt;在 shell 脚本， &lt;code&gt;#!&lt;/code&gt;  告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。 &lt;code&gt;#!&lt;/code&gt;  被称作&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly96aC53aWtpcGVkaWEub3JnL3dpa2kvU2hlYmFuZw==&#34;&gt; shebang（也称为 Hashbang ）&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#!&lt;/code&gt;  决定了脚本可以像一个独立的可执行文件一样执行，而不用在终端之前输入 &lt;code&gt;sh&lt;/code&gt; ,  &lt;code&gt;bash&lt;/code&gt; ,  &lt;code&gt;python&lt;/code&gt; ,  &lt;code&gt;php&lt;/code&gt;  等。&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 以下两种方式都可以指定 shell 解释器为 bash，第二种方式更好&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#!/bin/bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;注释&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#注释&#34;&gt;#&lt;/a&gt; 注释&lt;/h3&gt;
&lt;p&gt;注释可以说明你的代码是什么作用，以及为什么这样写。&lt;/p&gt;
&lt;p&gt;shell 语法中，注释是特殊的语句，会被 shell 解释器忽略。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单行注释 - 以  &lt;code&gt;#&lt;/code&gt;  开头，到行尾结束。&lt;/li&gt;
&lt;li&gt;多行注释 - 以  &lt;code&gt;:&amp;lt;&amp;lt;EOF&lt;/code&gt;  开头，到  &lt;code&gt;EOF&lt;/code&gt;  结束。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#--------------------------------------------&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# shell 注释示例&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# author：zp&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#--------------------------------------------&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# echo &#39; 这是单行注释&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;########## 这是分割线 ##########&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;:&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;echo &#39;这是多行注释&#39;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;echo &#39;这是多行注释&#39;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;echo &#39;这是多行注释&#39;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;EOF&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;echo&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#echo&#34;&gt;#&lt;/a&gt; echo&lt;/h3&gt;
&lt;p&gt;echo 用于字符串的输出。&lt;/p&gt;
&lt;p&gt;输出普通字符串：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, world&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello, world&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;输出含变量的字符串：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;zp&lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello, &#34;zp&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;输出含变量的字符串：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;zp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name&amp;#125;&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello, &#34;zp&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;输出含换行符的字符串：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出含换行符的字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;NO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: YES\nNO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;NO&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# -e 开启转义&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  NO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;输出含不换行符的字符串：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;NO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  NO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&lt;span class=&#34;token entity&#34; title=&#34;\c&#34;&gt;\c&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# -e 开启转义 \c 不换行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;NO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  YESNO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;输出重定向至文件&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;test&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; test.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;输出执行结果&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:(当前目录路径)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出普通字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, world&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: hello, world&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出含变量的字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;zp&lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: hello, &#34;zp&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出含变量的字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;zp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name&amp;#125;&lt;/span&gt;&lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: hello, &#34;zp&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出含换行符的字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;NO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: YES\nNO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;NO&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# -e 开启转义&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  NO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出含不换行符的字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;NO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  YES&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  NO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;YES&lt;span class=&#34;token entity&#34; title=&#34;\c&#34;&gt;\c&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# -e 开启转义 \c 不换行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;NO&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  YESNO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出内容定向至文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;test&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; test.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出执行结果&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:(当前目录路径)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;printf&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#printf&#34;&gt;#&lt;/a&gt; printf&lt;/h3&gt;
&lt;p&gt;printf 用于格式化输出字符串。&lt;/p&gt;
&lt;p&gt;默认，printf 不会像 echo 一样自动添加换行符，如果需要换行可以手动添加  &lt;code&gt;\n&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 单引号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;%d %s\n&#39;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;abc&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:1 abc&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 双引号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%d %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;abc&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:1 abc&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 无引号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; %s abcdef&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: abcdef (并不会换行)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 格式只指定了一个参数，但多出的参数仍然会按照该格式输出&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; abc def&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  abc&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  def&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%s %s %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; a b c d e f g h i j&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  a b c&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  d e f&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  g h i&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  j&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如果没有参数，那么 % s 用 NULL 代替，% d 用 0 代替&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%s and %d &lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#   and 0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 格式化输出&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%-10s %-8s %-4s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; 姓名 性别 体重kg&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%-10s %-8s %-4.2f&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; 郭靖 男 &lt;span class=&#34;token number&#34;&gt;66.1234&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%-10s %-8s %-4.2f&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; 杨过 男 &lt;span class=&#34;token number&#34;&gt;48.6543&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;%-10s %-8s %-4.2f&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; 郭芙 女 &lt;span class=&#34;token number&#34;&gt;47.9876&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  姓名     性别   体重 kg&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  郭靖     男      66.12&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  杨过     男      48.65&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  郭芙     女      47.99&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;printf-的转义符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#printf-的转义符&#34;&gt;#&lt;/a&gt; printf 的转义符&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序列&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;警告字符，通常为 ASCII 的 BEL 字符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;后退&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;抑制（不显示）输出结果中任何结尾的换行字符（只在 % b 格式指示符控制下的参数字符串中有效），而且，任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符，都被忽略&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换页（formfeed）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;回车（Carriage return）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;水平制表符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;垂直制表符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\\&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个字面上的反斜杠字符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\ddd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表示 1 到 3 位数八进制值的字符。仅在格式字符串中有效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\0ddd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表示 1 到 3 位的八进制值字符&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;变量&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#变量&#34;&gt;#&lt;/a&gt; 变量&lt;/h2&gt;
&lt;p&gt;跟许多程序设计语言一样，你可以在 bash 中创建变量。&lt;/p&gt;
&lt;p&gt;Bash 中没有数据类型，bash 中的变量可以保存一个数字、一个字符、一个字符串等等。同时无需提前声明变量，给变量赋值会直接创建变量。&lt;/p&gt;
&lt;h3 id=&#34;变量命名原则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#变量命名原则&#34;&gt;#&lt;/a&gt; 变量命名原则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;命名只能使用英文字母，数字和下划线，首个字符不能以数字开头。&lt;/li&gt;
&lt;li&gt;中间不能有空格，可以使用下划线（_）。&lt;/li&gt;
&lt;li&gt;不能使用标点符号。&lt;/li&gt;
&lt;li&gt;不能使用 bash 里的关键字（可用 help 命令查看保留关键字）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;声明变量&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#声明变量&#34;&gt;#&lt;/a&gt; 声明变量&lt;/h3&gt;
&lt;p&gt;访问变量的语法形式为： &lt;code&gt;$&amp;#123;var&amp;#125;&lt;/code&gt;  和  &lt;code&gt;$var&lt;/code&gt;  。&lt;/p&gt;
&lt;p&gt;变量名外面的花括号是可选的，加不加都行，加花括号是为了帮助解释器识别变量的边界，所以推荐加花括号。&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;word&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;word&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;只读变量&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#只读变量&#34;&gt;#&lt;/a&gt; 只读变量&lt;/h3&gt;
&lt;p&gt;使用 readonly 命令可以将变量定义为只读变量，只读变量的值不能被改变。&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;rword&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;rword&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;readonly&lt;/span&gt; rword&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# rword=&#34;bye&#34;  # 如果放开注释，执行时会报错&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;删除变量&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#删除变量&#34;&gt;#&lt;/a&gt; 删除变量&lt;/h3&gt;
&lt;p&gt;使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;dword&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 声明变量&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;dword&amp;#125;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;# 输出变量值&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;unset&lt;/span&gt; dword    &lt;span class=&#34;token comment&#34;&gt;# 删除变量&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;dword&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: （空）&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;变量类型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#变量类型&#34;&gt;#&lt;/a&gt; 变量类型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;局部变量&lt;/strong&gt; - 局部变量是仅在某个脚本内部有效的变量。它们不能被其他的程序和脚本访问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境变量&lt;/strong&gt; - 环境变量是对当前 shell 会话内所有的程序或脚本都可见的变量。创建它们跟创建局部变量类似，但使用的是  &lt;code&gt;export&lt;/code&gt;  关键字，shell 脚本也可以定义环境变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常见的环境变量：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$HOME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前用户的用户目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$PATH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用分号分隔的目录列表，shell 会到这些目录中查找命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$PWD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前工作目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$RANDOM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0 到 32767 之间的整数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$UID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数值类型，当前用户的用户 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$PS1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主要系统输入提示符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$PS2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;次要系统输入提示符&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3RsZHAub3JnL0xEUC9CYXNoLUJlZ2lubmVycy1HdWlkZS9odG1sL3NlY3RfMDNfMDIuaHRtbCMjI3NlY3RfMDNfMDJfMDQ=&#34;&gt;这里&lt;/span&gt; 有一张更全面的 Bash 环境变量列表。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 声明变量 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;world&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello world&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 输出变量 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;folder&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;current path: &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;folder&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 只读变量 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;rword&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;rword&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;readonly&lt;/span&gt; rword&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# rword=&#34;bye&#34;  # 如果放开注释，执行时会报错&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 删除变量 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;dword&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 声明变量&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;dword&amp;#125;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 输出变量值&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: hello&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;unset&lt;/span&gt; dword &lt;span class=&#34;token comment&#34;&gt;# 删除变量&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;dword&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: （空）&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 系统变量 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;UID:&lt;span class=&#34;token environment constant&#34;&gt;$UID&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;LOGNAME&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token environment constant&#34;&gt;$LOGNAME&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; User:&lt;span class=&#34;token environment constant&#34;&gt;$USER&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;HOME&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token environment constant&#34;&gt;$HOME&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token environment constant&#34;&gt;$PATH&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;HOSTNAME&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token environment constant&#34;&gt;$HOSTNAME&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;SHELL&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token environment constant&#34;&gt;$SHELL&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token environment constant&#34;&gt;LANG&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;token environment constant&#34;&gt;$LANG&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 自定义变量 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;days&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;admin&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$user&lt;/span&gt; logged in &lt;span class=&#34;token variable&#34;&gt;$days&lt;/span&gt; days age&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;days&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;root&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$user&lt;/span&gt; logged in &lt;span class=&#34;token variable&#34;&gt;$days&lt;/span&gt; days age&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# admin logged in 10 days age&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# root logged in 5 days age&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 从变量读取列表 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;colors&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;Red Yellow Blue&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;colors&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$colors&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34; White Black&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;color&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$colors&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34; &lt;span class=&#34;token variable&#34;&gt;$color&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;字符串&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#字符串&#34;&gt;#&lt;/a&gt; 字符串&lt;/h2&gt;
&lt;h3 id=&#34;单引号和双引号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#单引号和双引号&#34;&gt;#&lt;/a&gt; 单引号和双引号&lt;/h3&gt;
&lt;p&gt;shell 字符串可以用单引号  &lt;code&gt;&#39;&#39;&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;/li&gt;
&lt;li&gt;单引号里不能出现单独的单引号（使用转义符也不行），但可成对出现，作为字符串拼接使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;双引号的特点
&lt;ul&gt;
&lt;li&gt;双引号里识别变量&lt;/li&gt;
&lt;li&gt;双引号里可以出现转义字符&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;综上，推荐使用双引号。&lt;/p&gt;
&lt;h3 id=&#34;拼接字符串&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#拼接字符串&#34;&gt;#&lt;/a&gt; 拼接字符串&lt;/h3&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用单引号拼接&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name1&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;white&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str1&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello, &#39;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name1&amp;#125;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str2&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello, $&amp;#123;name1&amp;#125;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str1&amp;#125;&lt;/span&gt;_&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str2&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# hello, white_hello, $&amp;#123;name1&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用双引号拼接&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name2&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;black&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str3&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello, &#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name2&amp;#125;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str4&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name2&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str3&amp;#125;&lt;/span&gt;_&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str4&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# hello, black_hello, black&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;获取字符串长度&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#获取字符串长度&#34;&gt;#&lt;/a&gt; 获取字符串长度&lt;/h3&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;12345&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;&lt;span class=&#34;token operator&#34;&gt;#&lt;/span&gt;text&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;截取子字符串&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#截取子字符串&#34;&gt;#&lt;/a&gt; 截取子字符串&lt;/h3&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;12345&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;text&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;2&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;2&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 34&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;从第 3 个字符开始，截取 2 个字符&lt;/p&gt;
&lt;h3 id=&#34;查找子字符串&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#查找子字符串&#34;&gt;#&lt;/a&gt; 查找子字符串&lt;/h3&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; index &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;text&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt; ll&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Execute: ./str-demo5.sh&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;查找  &lt;code&gt;ll&lt;/code&gt;  子字符在  &lt;code&gt;hello&lt;/code&gt;  字符串中的起始位置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 使用单引号拼接字符串 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name1&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;white&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str1&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello, &#39;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name1&amp;#125;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str2&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello, $&amp;#123;name1&amp;#125;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str1&amp;#125;&lt;/span&gt;_&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str2&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# hello, white_hello, $&amp;#123;name1&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 使用双引号拼接字符串 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name2&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;black&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str3&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello, &#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name2&amp;#125;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str4&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;name2&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str3&amp;#125;&lt;/span&gt;_&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str4&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# hello, black_hello, black&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 获取字符串长度 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;12345&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;text&amp;#125;&lt;/span&gt; length is: &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;&lt;span class=&#34;token operator&#34;&gt;#&lt;/span&gt;text&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 12345 length is: 5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 获取子字符串&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;12345&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;text&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;2&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;2&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 34&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 查找子字符串 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; index &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;text&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt; ll&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 判断字符串中是否包含子字符串 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;feature/&#34;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$result&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;feature/ 是 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str&amp;#125;&lt;/span&gt; 的子字符串&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;feature/ 不是 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str&amp;#125;&lt;/span&gt; 的子字符串&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 截取关键字左边内容 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;full_branch&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;feature/1.0.0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;branch&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;full_branch&lt;span class=&#34;token comment&#34;&gt;#feature/&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;branch is &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;branch&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 截取关键字右边内容 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;full_version&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;0.0.1-SNAPSHOT&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;full_version%-SNAPSHOT&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;version is &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;version&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 字符串分割成数组 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;0.0.0.1&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;OLD_IFS&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token environment constant&#34;&gt;$IFS&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;&lt;span class=&#34;token environment constant&#34;&gt;IFS&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;.&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;str&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;&lt;span class=&#34;token environment constant&#34;&gt;IFS&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$OLD_IFS&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;61&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;&lt;span class=&#34;token operator&#34;&gt;#&lt;/span&gt;array&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;62&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;lastIndex&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;size&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; - &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;63&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;数组长度：&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;size&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;64&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;最后一个数组元素：&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;array&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;$&amp;#123;lastIndex&amp;#125;&lt;/span&gt;]&amp;#125;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;65&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;array&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;66&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;67&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$item&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;68&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;69&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;70&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 判断字符串是否为空 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;71&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#-n 判断长度是否非零&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;72&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#-z 判断长度是否为零&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;73&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;74&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;testing&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;75&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str2&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;76&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$str&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;77&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;78&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;The string &lt;span class=&#34;token variable&#34;&gt;$str&lt;/span&gt; is not empty&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;79&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;80&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;The string &lt;span class=&#34;token variable&#34;&gt;$str&lt;/span&gt; is empty&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;81&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;82&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;83&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$str2&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;84&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;85&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;The string &lt;span class=&#34;token variable&#34;&gt;$str2&lt;/span&gt; is not empty&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;86&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;87&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;The string &lt;span class=&#34;token variable&#34;&gt;$str2&lt;/span&gt; is empty&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;88&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;89&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;90&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#	Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;91&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#	The string testing is not empty&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;92&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#	The string  is empty&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;93&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;94&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 字符串比较 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;95&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;hello&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;96&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;str2&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;world&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;97&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$str&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;98&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;str equals hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;99&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;100&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;str not equals hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;101&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;102&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;103&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$str2&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;104&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;str2 equals hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;105&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;106&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;	&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;str2 not equals hello&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;107&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;数组&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#数组&#34;&gt;#&lt;/a&gt; 数组&lt;/h2&gt;
&lt;p&gt;bash 只支持一维数组。&lt;/p&gt;
&lt;p&gt;数组下标从 0 开始，下标可以是整数或算术表达式，其值应大于或等于 0。&lt;/p&gt;
&lt;h3 id=&#34;创建数组&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#创建数组&#34;&gt;#&lt;/a&gt; 创建数组&lt;/h3&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建数组的不同方式&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;colors&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;red yellow &lt;span class=&#34;token string&#34;&gt;&#34;dark blue&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;访问数组元素&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#访问数组元素&#34;&gt;#&lt;/a&gt; 访问数组元素&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;访问数组的单个元素：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;1&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: 1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;访问数组的所有元素：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: red yellow dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: red yellow dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;上面两行有很重要（也很微妙）的区别：&lt;/p&gt;
&lt;p&gt;为了将数组中每个元素单独一行输出，我们用  &lt;code&gt;printf&lt;/code&gt;  命令：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + red&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + yellow&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + dark&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;为什么 &lt;code&gt;dark&lt;/code&gt;  和 &lt;code&gt;blue&lt;/code&gt;  各占了一行？尝试用引号包起来：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + red yellow dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;现在所有的元素都在一行输出 —— 这不是我们想要的！让我们试试 &lt;code&gt;$&amp;#123;colors[@]&amp;#125;&lt;/code&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + red&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + yellow&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;在引号内， &lt;code&gt;$&amp;#123;colors[@]&amp;#125;&lt;/code&gt;  将数组中的每个元素扩展为一个单独的参数；数组元素中的空格得以保留。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;访问数组的部分元素：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;0&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;2&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 0 1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;在上面的例子中， &lt;code&gt;$&amp;#123;array[@]&amp;#125;&lt;/code&gt;  扩展为整个数组， &lt;code&gt;:0:2&lt;/code&gt;  取出了数组中从 0 开始，长度为 2 的元素。&lt;/p&gt;
&lt;h3 id=&#34;访问数组长度&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#访问数组长度&#34;&gt;#&lt;/a&gt; 访问数组长度&lt;/h3&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;&lt;span class=&#34;token operator&#34;&gt;#&lt;/span&gt;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;向数组中添加元素&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#向数组中添加元素&#34;&gt;#&lt;/a&gt; 向数组中添加元素&lt;/h3&gt;
&lt;p&gt;向数组中添加元素也非常简单：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;colors&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;white &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt; green black&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# white red yellow dark blue green black&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;上面的例子中， &lt;code&gt;$&amp;#123;colors[@]&amp;#125;&lt;/code&gt;  扩展为整个数组，并被置换到复合赋值语句中，接着，对数组 &lt;code&gt;colors&lt;/code&gt;  的赋值覆盖了它原来的值。&lt;/p&gt;
&lt;h3 id=&#34;从数组中删除元素&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#从数组中删除元素&#34;&gt;#&lt;/a&gt; 从数组中删除元素&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;unset&lt;/code&gt;  命令来从数组中删除一个元素：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;unset&lt;/span&gt; nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 1 2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 创建数组 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;nums&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;colors&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; red yellow &lt;span class=&#34;token string&#34;&gt;&#34;dark blue&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 访问数组的单个元素 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;1&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: 1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 访问数组的所有元素 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: red yellow dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: red yellow dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + red&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + yellow&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + dark&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + red yellow dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + red&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + yellow&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# + dark blue&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 访问数组的部分元素 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;0&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;2&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 0 1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 获取数组长度 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;&lt;span class=&#34;token operator&#34;&gt;#&lt;/span&gt;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;*&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 向数组中添加元素 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;colors&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; white &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt; green black &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;colors&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# white red yellow dark blue green black&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;################### 从数组中删除元素 ###################&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;unset&lt;/span&gt; nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;nums&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;@&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 1 2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#运算符&#34;&gt;#&lt;/a&gt; 运算符&lt;/h2&gt;
&lt;h3 id=&#34;算术运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#算术运算符&#34;&gt;#&lt;/a&gt; 算术运算符&lt;/h3&gt;
&lt;p&gt;下表列出了常用的算术运算符，假定变量 x 为 10，变量 y 为 20：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;运算符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;加法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expr $x + $y&lt;/code&gt;  结果为 30。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;减法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expr $x - $y&lt;/code&gt;  结果为 -10。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;乘法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expr $x * $y&lt;/code&gt;  结果为 200。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;除法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expr $y / $x&lt;/code&gt;  结果为 2。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;取余&lt;/td&gt;
&lt;td&gt;&lt;code&gt;expr $y % $x&lt;/code&gt;  结果为 0。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;td&gt;赋值&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x=$y&lt;/code&gt;  将把变量 y 的值赋给 x。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;==&lt;/td&gt;
&lt;td&gt;相等。用于比较两个数字，相同则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $x == $y ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!=&lt;/td&gt;
&lt;td&gt;不相等。用于比较两个数字，不相同则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $x != $y ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;** 注意：** 条件表达式要放在方括号之间，并且要有空格，例如:  &lt;code&gt;[$x==$y]&lt;/code&gt;  是错误的，必须写成  &lt;code&gt;[ $x == $y ]&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;x=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;, y=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; + $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; + &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$val&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; - $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; - &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$val&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;* $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; * &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$val&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; / $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; / &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$val&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; % $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; % &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$val&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; != &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  x=10, y=20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 + 20 = 30&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 - 20 = -10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 * 20 = 200&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  20 / 10 = 2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  20 % 10 = 0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 != 20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;关系运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#关系运算符&#34;&gt;#&lt;/a&gt; 关系运算符&lt;/h3&gt;
&lt;p&gt;关系运算符只支持数字，不支持字符串，除非字符串的值是数字。&lt;/p&gt;
&lt;p&gt;下表列出了常用的关系运算符，假定变量 x 为 10，变量 y 为 20：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;运算符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-eq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测两个数是否相等，相等返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -eq $b ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-ne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测两个数是否相等，不相等返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -ne $b ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-gt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测左边的数是否大于右边的，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -gt $b ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-lt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测左边的数是否小于右边的，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -lt $b ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-ge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测左边的数是否大于等于右边的，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -ge $b ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-le&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测左边的数是否小于等于右边的，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -le $b ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;x=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;, y=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -eq &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; : x 等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -eq &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 不等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -ne &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 不等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -ne &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gt&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -gt &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 大于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -gt &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 不大于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -lt &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 小于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -lt &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 不小于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ge&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -ge &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 大于或等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -ge &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 小于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-le&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -le &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 小于或等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -le &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 大于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  x=10, y=20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -eq 20: x 不等于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -ne 20: x 不等于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -gt 20: x 不大于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -lt 20: x 小于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -ge 20: x 小于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -le 20: x 小于或等于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;布尔运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#布尔运算符&#34;&gt;#&lt;/a&gt; 布尔运算符&lt;/h3&gt;
&lt;p&gt;下表列出了常用的布尔运算符，假定变量 x 为 10，变量 y 为 20：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;运算符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;非运算，表达式为 true 则返回 false，否则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ ! false ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;或运算，有一个表达式为 true 则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -lt 20 -o $b -gt 100 ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;与运算，两个表达式都为 true 才返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a -lt 20 -a $b -gt 100 ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;x=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;, y=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; != &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; : x 不等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; != &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;15&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; 小于 100 且 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; 大于 15 : 返回 true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; 小于 100 且 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; 大于 15 : 返回 false&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; 小于 100 或 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; 大于 100 : 返回 true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; 小于 100 或 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; 大于 100 : 返回 false&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; 小于 5 或 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; 大于 100 : 返回 true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; 小于 5 或 &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; 大于 100 : 返回 false&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  x=10, y=20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 != 20 : x 不等于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 小于 100 且 20 大于 15 : 返回 true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 小于 100 或 20 大于 100 : 返回 true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 小于 5 或 20 大于 100 : 返回 false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;逻辑运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#逻辑运算符&#34;&gt;#&lt;/a&gt; 逻辑运算符&lt;/h3&gt;
&lt;p&gt;以下介绍 Shell 的逻辑运算符，假定变量 x 为 10，变量 y 为 20:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;运算符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;逻辑的 AND&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[[ $&amp;#123;x&amp;#125; -lt 100 &amp;amp;&amp;amp; $&amp;#123;y&amp;#125; -gt 100 ]]&lt;/code&gt;  返回 false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;| |&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;逻辑的 OR&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[[ $&amp;#123;x&amp;#125; -lt 100 | | $&amp;#123;y&amp;#125; -gt 100 ]]&lt;/code&gt;  返回 true&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;x=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;, y=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -lt 100 &amp;amp;&amp;amp; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; -gt 100 返回 true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -lt 100 &amp;amp;&amp;amp; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; -gt 100 返回 false&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -lt 100 || &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; -gt 100 返回 true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; -lt 100 || &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; -gt 100 返回 false&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  x=10, y=20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -lt 100 &amp;amp;&amp;amp; 20 -gt 100 返回 false&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  10 -lt 100 || 20 -gt 100 返回 true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;字符串运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#字符串运算符&#34;&gt;#&lt;/a&gt; 字符串运算符&lt;/h3&gt;
&lt;p&gt;下表列出了常用的字符串运算符，假定变量 a 为 &amp;quot;abc&amp;quot;，变量 b 为 &amp;quot;efg&amp;quot;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;运算符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测两个字符串是否相等，相等返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a = $b ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测两个字符串是否相等，不相等返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a != $b ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测字符串长度是否为 0，为 0 返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -z $a ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测字符串长度是否为 0，不为 0 返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -n $a ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检测字符串是否为空，不为空返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ $a ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;abc&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;xyz&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;x=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;, y=&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; : x 等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 不等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; != &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; : x 不等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; != &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;: x 等于 y&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-z&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-z &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; : 字符串长度为 0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-z &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; : 字符串长度不为 0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-n &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; : 字符串长度不为 0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-n &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; : 字符串长度为 0&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; : 字符串不为空&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; : 字符串为空&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  x=abc, y=xyz&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  abc = xyz: x 不等于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  abc != xyz : x 不等于 y&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  -z abc : 字符串长度不为 0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  -n abc : 字符串长度不为 0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  abc : 字符串不为空&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;文件测试运算符&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#文件测试运算符&#34;&gt;#&lt;/a&gt; 文件测试运算符&lt;/h3&gt;
&lt;p&gt;文件测试运算符用于检测 Unix 文件的各种属性。&lt;/p&gt;
&lt;p&gt;属性检测描述如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;举例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-b file&lt;/td&gt;
&lt;td&gt;检测文件是否是块设备文件，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -b $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-c file&lt;/td&gt;
&lt;td&gt;检测文件是否是字符设备文件，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -c $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-d file&lt;/td&gt;
&lt;td&gt;检测文件是否是目录，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -d $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-f file&lt;/td&gt;
&lt;td&gt;检测文件是否是普通文件（既不是目录，也不是设备文件），如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -f $file ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-g file&lt;/td&gt;
&lt;td&gt;检测文件是否设置了 SGID 位，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -g $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-k file&lt;/td&gt;
&lt;td&gt;检测文件是否设置了粘着位 (Sticky Bit)，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -k $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-p file&lt;/td&gt;
&lt;td&gt;检测文件是否是有名管道，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -p $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-u file&lt;/td&gt;
&lt;td&gt;检测文件是否设置了 SUID 位，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -u $file ]&lt;/code&gt;  返回 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-r file&lt;/td&gt;
&lt;td&gt;检测文件是否可读，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -r $file ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-w file&lt;/td&gt;
&lt;td&gt;检测文件是否可写，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -w $file ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-x file&lt;/td&gt;
&lt;td&gt;检测文件是否可执行，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -x $file ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-s file&lt;/td&gt;
&lt;td&gt;检测文件是否为空（文件大小是否大于 0），不为空返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -s $file ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-e file&lt;/td&gt;
&lt;td&gt;检测文件（包括目录）是否存在，如果是，则返回 true。&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ -e $file ]&lt;/code&gt;  返回 true。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;/etc/hosts&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件可读&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件不可读&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-w&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件可写&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件不可写&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-x&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件可执行&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件不可执行&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件为普通文件&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件为特殊文件&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件是个目录&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件不是个目录&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件不为空&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件为空&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件存在&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;file&amp;#125;&lt;/span&gt; 文件不存在&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:(根据文件的实际情况，输出结果可能不同)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件可读&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件可写&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件不可执行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件为普通文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件不是个目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件不为空&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  /etc/hosts 文件存在&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;控制语句&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#控制语句&#34;&gt;#&lt;/a&gt; 控制语句&lt;/h2&gt;
&lt;h3 id=&#34;条件语句&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#条件语句&#34;&gt;#&lt;/a&gt; 条件语句&lt;/h3&gt;
&lt;p&gt;跟其它程序设计语言一样，Bash 中的条件语句让我们可以决定一个操作是否被执行。结果取决于一个包在 &lt;code&gt;[[ ]]&lt;/code&gt;  里的表达式。&lt;/p&gt;
&lt;p&gt;由 &lt;code&gt;[[ ]]&lt;/code&gt; （ &lt;code&gt;sh&lt;/code&gt;  中是 &lt;code&gt;[ ]&lt;/code&gt; ）包起来的表达式被称作 &lt;strong&gt;检测命令&lt;/strong&gt; 或 &lt;strong&gt;基元&lt;/strong&gt;。这些表达式帮助我们检测一个条件的结果。这里可以找到有关&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3NlcnZlcmZhdWx0LmNvbS9hLzUyMDUw&#34;&gt; bash 中单双中括号区别&lt;/span&gt;的答案。&lt;/p&gt;
&lt;p&gt;共有两个不同的条件表达式： &lt;code&gt;if&lt;/code&gt;  和 &lt;code&gt;case&lt;/code&gt; 。&lt;/p&gt;
&lt;h4 id=&#34;if&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#if&#34;&gt;#&lt;/a&gt;  &lt;code&gt;if&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;（1） &lt;code&gt;if&lt;/code&gt;  语句&lt;/p&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt;  在使用上跟其它语言相同。如果中括号里的表达式为真，那么 &lt;code&gt;then&lt;/code&gt;  和 &lt;code&gt;fi&lt;/code&gt;  之间的代码会被执行。 &lt;code&gt;fi&lt;/code&gt;  标志着条件代码块的结束。&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 写成一行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;1 -eq 1 result is: true&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: 1 -eq 1 result is: true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 写成多行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;abc&#34;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;abc&#34;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;abc&lt;span class=&#34;token string&#34;&gt;&#34; -eq &#34;&lt;/span&gt;abc&lt;span class=&#34;token string&#34;&gt;&#34; result is: true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: abc -eq abc result is: true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;（2） &lt;code&gt;if else&lt;/code&gt;  语句&lt;/p&gt;
&lt;p&gt;同样，我们可以使用 &lt;code&gt;if..else&lt;/code&gt;  语句，例如：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;true&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;false&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: true&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;（3） &lt;code&gt;if elif else&lt;/code&gt;  语句&lt;/p&gt;
&lt;p&gt;有些时候， &lt;code&gt;if..else&lt;/code&gt;  不能满足我们的要求。别忘了 &lt;code&gt;if..elif..else&lt;/code&gt; ，使用起来也很方便。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;elif&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &amp;lt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;   &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: 10 &amp;lt; 20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;case&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#case&#34;&gt;#&lt;/a&gt;  &lt;code&gt;case&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;如果你需要面对很多情况，分别要采取不同的措施，那么使用 &lt;code&gt;case&lt;/code&gt;  会比嵌套的 &lt;code&gt;if&lt;/code&gt;  更有用。使用 &lt;code&gt;case&lt;/code&gt;  来解决复杂的条件判断，看起来像下面这样：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;exec&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;oper&amp;#125;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token string&#34;&gt;&#34;+&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; + $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; + &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;val&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token string&#34;&gt;&#34;-&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; - $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; - &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;val&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token string&#34;&gt;&#34;*&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;* $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; * &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;val&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token string&#34;&gt;&#34;/&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token assign-left variable&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; / $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; / &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt; = &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;val&amp;#125;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  *&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Unknown oper!&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;esac&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;每种情况都是匹配了某个模式的表达式。 &lt;code&gt;|&lt;/code&gt;  用来分割多个模式， &lt;code&gt;)&lt;/code&gt;  用来结束一个模式序列。第一个匹配上的模式对应的命令将会被执行。 &lt;code&gt;*&lt;/code&gt;  代表任何不匹配以上给定模式的模式。命令块儿之间要用 &lt;code&gt;;;&lt;/code&gt;  分隔。&lt;/p&gt;
&lt;h3 id=&#34;循环语句&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#循环语句&#34;&gt;#&lt;/a&gt; 循环语句&lt;/h3&gt;
&lt;p&gt;循环其实不足为奇。跟其它程序设计语言一样，bash 中的循环也是只要控制条件为真就一直迭代执行的代码块。&lt;/p&gt;
&lt;p&gt;Bash 中有四种循环： &lt;code&gt;for&lt;/code&gt; ， &lt;code&gt;while&lt;/code&gt; ， &lt;code&gt;until&lt;/code&gt;  和 &lt;code&gt;select&lt;/code&gt; 。&lt;/p&gt;
&lt;h4 id=&#34;for循环&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#for循环&#34;&gt;#&lt;/a&gt;  &lt;code&gt;for&lt;/code&gt;  循环&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt;  与它在 C 语言中的姊妹非常像。看起来是这样：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;arg&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; elem1 elem2 &lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. elemN&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token comment&#34;&gt;### 语句&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;在每次循环的过程中， &lt;code&gt;arg&lt;/code&gt;  依次被赋值为从 &lt;code&gt;elem1&lt;/code&gt;  到 &lt;code&gt;elemN&lt;/code&gt; 。这些值还可以是通配符或者&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2RlbnlzZG92aGFuL2Jhc2gtaGFuZGJvb2svYmxvYi9tYXN0ZXIvdHJhbnNsYXRpb25zL3poLUNOL1JFQURNRS5tZCMlRTUlQTQlQTclRTYlOEIlQUMlRTUlOEYlQjclRTYlODklQTklRTUlQjElOTU=&#34;&gt;大括号扩展&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;当然，我们还可以把 &lt;code&gt;for&lt;/code&gt;  循环写在一行，但这要求 &lt;code&gt;do&lt;/code&gt;  之前要有一个分号，就像下面这样：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;还有，如果你觉得 &lt;code&gt;for..in..do&lt;/code&gt;  对你来说有点奇怪，那么你也可以像 C 语言那样使用 &lt;code&gt;for&lt;/code&gt; ，比如：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;当我们想对一个目录下的所有文件做同样的操作时， &lt;code&gt;for&lt;/code&gt;  就很方便了。举个例子，如果我们想把所有的 &lt;code&gt;.bash&lt;/code&gt;  文件移动到 &lt;code&gt;script&lt;/code&gt;  文件夹中，并给它们可执行权限，我们的脚本可以这样写：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;DIR&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;/home/zp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;FILE&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;DIR&amp;#125;&lt;/span&gt;/*.sh&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$FILE&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;DIR&amp;#125;&lt;/span&gt;/scripts&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将 /home/zp 目录下所有 sh 文件拷贝到 /home/zp/scripts&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;while循环&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#while循环&#34;&gt;#&lt;/a&gt;  &lt;code&gt;while&lt;/code&gt;  循环&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;while&lt;/code&gt;  循环检测一个条件，只要这个条件为 &lt;em&gt;真&lt;/em&gt;，就执行一段命令。被检测的条件跟 &lt;code&gt;if..then&lt;/code&gt;  中使用的&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2RlbnlzZG92aGFuL2Jhc2gtaGFuZGJvb2svYmxvYi9tYXN0ZXIvdHJhbnNsYXRpb25zL3poLUNOL1JFQURNRS5tZCMlRTUlOUYlQkElRTUlODUlODMlRTUlOTIlOEMlRTclQkIlODQlRTUlOTAlODglRTglQTElQTglRTglQkUlQkUlRTUlQkMlOEY=&#34;&gt;基元&lt;/span&gt;并无二异。因此一个 &lt;code&gt;while&lt;/code&gt;  循环看起来会是这样：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; condition &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token comment&#34;&gt;### 语句&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;跟 &lt;code&gt;for&lt;/code&gt;  循环一样，如果我们把 &lt;code&gt;do&lt;/code&gt;  和被检测的条件写到一行，那么必须要在 &lt;code&gt;do&lt;/code&gt;  之前加一个分号。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;### 0 到 9 之间每个数的平方&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;x &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; x&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;x &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  4&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  9&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  16&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  25&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  36&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  49&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  64&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  81&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;until循环&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#until循环&#34;&gt;#&lt;/a&gt;  &lt;code&gt;until&lt;/code&gt;  循环&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;until&lt;/code&gt;  循环跟 &lt;code&gt;while&lt;/code&gt;  循环正好相反。它跟 &lt;code&gt;while&lt;/code&gt;  一样也需要检测一个测试条件，但不同的是，只要该条件为 &lt;em&gt;假&lt;/em&gt; 就一直执行循环：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;until&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ge&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; + &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  4&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;select循环&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#select循环&#34;&gt;#&lt;/a&gt;  &lt;code&gt;select&lt;/code&gt;  循环&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;select&lt;/code&gt;  循环帮助我们组织一个用户菜单。它的语法几乎跟 &lt;code&gt;for&lt;/code&gt;  循环一致：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;select&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;answer&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; elem1 elem2 &lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. elemN&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token comment&#34;&gt;### 语句&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;select&lt;/code&gt;  会打印 &lt;code&gt;elem1..elemN&lt;/code&gt;  以及它们的序列号到屏幕上，之后会提示用户输入。通常看到的是 &lt;code&gt;$?&lt;/code&gt; （ &lt;code&gt;PS3&lt;/code&gt;  变量）。用户的选择结果会被保存到 &lt;code&gt;answer&lt;/code&gt;  中。如果 &lt;code&gt;answer&lt;/code&gt;  是一个在 &lt;code&gt;1..N&lt;/code&gt;  之间的数字，那么 &lt;code&gt;语句&lt;/code&gt; 会被执行，紧接着会进行下一次迭代 —— 如果不想这样的话我们可以使用 &lt;code&gt;break&lt;/code&gt;  语句。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;&lt;span class=&#34;token environment constant&#34;&gt;PS3&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;Choose the package manager: &#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;select&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;ITEM&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; bower &lt;span class=&#34;token function&#34;&gt;npm&lt;/span&gt; gem pip&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Enter the package name: &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; PACKAGE&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;ITEM&amp;#125;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  bower&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; bower &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;PACKAGE&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token function&#34;&gt;npm&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;npm&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;PACKAGE&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  gem&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; gem &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;PACKAGE&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  pip&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; pip &lt;span class=&#34;token function&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;PACKAGE&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;esac&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;break&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 避免无限循环&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;这个例子，先询问用户他想使用什么包管理器。接着，又询问了想安装什么包，最后执行安装操作。&lt;/p&gt;
&lt;p&gt;运行这个脚本，会得到如下输出：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ ./my_script&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; bower&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;npm&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; gem&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; pip&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Choose the package manager: &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Enter the package name: gitbook-cli&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;break-和-continue&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#break-和-continue&#34;&gt;#&lt;/a&gt;  &lt;code&gt;break&lt;/code&gt;  和  &lt;code&gt;continue&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;如果想提前结束一个循环或跳过某次循环执行，可以使用 shell 的 &lt;code&gt;break&lt;/code&gt;  和 &lt;code&gt;continue&lt;/code&gt;  语句来实现。它们可以在任何循环中使用。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;break&lt;/code&gt;  语句用来提前结束当前循环。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;continue&lt;/code&gt;  语句用来跳过某次迭代。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查找 10 以内第一个能整除 2 和 3 的正整数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;i&amp;#125;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lt&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;i &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;i &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;i&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token assign-left variable&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;expr&lt;/span&gt; $&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; + &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Output: 6&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 打印 10 以内的奇数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;i &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-eq&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token builtin class-name&#34;&gt;continue&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;i&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  7&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  9&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;函数&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#函数&#34;&gt;#&lt;/a&gt; 函数&lt;/h2&gt;
&lt;p&gt;bash 函数定义语法如下：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; funname &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    action&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;return int&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;💡 说明：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;函数定义时， &lt;code&gt;function&lt;/code&gt;  关键字可有可无。&lt;/li&gt;
&lt;li&gt;函数返回值 - return 返回函数返回值，返回值类型只能为整数（0-255）。如果不加 return 语句，shell 默认将以最后一条命令的运行结果，作为函数返回值。&lt;/li&gt;
&lt;li&gt;函数返回值在调用该函数后通过  &lt;code&gt;$?&lt;/code&gt;  来获得。&lt;/li&gt;
&lt;li&gt;所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分，直至 shell 解释器首次发现它时，才可以使用。调用函数仅使用其函数名即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function-name function&#34;&gt;calc&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token assign-left variable&#34;&gt;&lt;span class=&#34;token environment constant&#34;&gt;PS3&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;choose the oper: &#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;select&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;oper&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; + - &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;* / &lt;span class=&#34;token comment&#34;&gt;# 生成操作符选择菜单&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;enter first num: &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; x &lt;span class=&#34;token comment&#34;&gt;# 读取输入参数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;enter second num: &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;read&lt;/span&gt; y &lt;span class=&#34;token comment&#34;&gt;# 读取输入参数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;exec&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;oper&amp;#125;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token string&#34;&gt;&#34;+&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token builtin class-name&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;$&amp;#123;x&amp;#125; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; $&amp;#123;y&amp;#125;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token string&#34;&gt;&#34;-&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token builtin class-name&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;$&amp;#123;x&amp;#125; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; $&amp;#123;y&amp;#125;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token string&#34;&gt;&#34;*&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token builtin class-name&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;$&amp;#123;x&amp;#125; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; $&amp;#123;y&amp;#125;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token string&#34;&gt;&#34;/&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token builtin class-name&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt;$&amp;#123;x&amp;#125; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt; $&amp;#123;y&amp;#125;&lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    *&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$&amp;#123;oper&amp;#125;&lt;/span&gt; is not support!&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;      &lt;span class=&#34;token builtin class-name&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;esac&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;break&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;calc&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;the result is: &lt;span class=&#34;token variable&#34;&gt;$?&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# $? 获取 calc 函数返回值&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;执行结果：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ ./function-demo.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; +&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; -&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; *&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; /&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;choose the oper: &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;enter first num: &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;enter second num: &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;the result is: &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;位置参数&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#位置参数&#34;&gt;#&lt;/a&gt; 位置参数&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;位置参数&lt;/strong&gt;是在调用一个函数并传给它参数时创建的变量。&lt;/p&gt;
&lt;p&gt;位置参数变量表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;脚本名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$1 … $9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第 1 个到第 9 个参数列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$&amp;#123;10&amp;#125; … $&amp;#123;N&amp;#125;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;第 10 个到 N 个参数列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$*&lt;/code&gt;  or  &lt;code&gt;$@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;除了 &lt;code&gt;$0&lt;/code&gt;  外的所有位置参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不包括 &lt;code&gt;$0&lt;/code&gt;  在内的位置参数的个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$FUNCNAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;函数名称（仅在函数内部有值）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$1&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;第一个参数为：&lt;span class=&#34;token variable&#34;&gt;$1&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;第一个参数为空&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$2&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;then&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;第二个参数为：&lt;span class=&#34;token variable&#34;&gt;$2&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;$2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;第二个参数为空&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function-name function&#34;&gt;paramsFunction&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;函数第一个入参：&lt;span class=&#34;token variable&#34;&gt;$1&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;函数第二个入参：&lt;span class=&#34;token variable&#34;&gt;$2&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;paramsFunction &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;x&amp;#125;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;y&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;执行结果：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ ./function-demo2.sh&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;第一个参数为空&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;第二个参数为空&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;函数第一个入参：0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;函数第二个入参：0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ ./function-demo2.sh &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;第一个参数为：10&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;第二个参数为：20&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;函数第一个入参：10&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;函数第二个入参：20&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;执行  &lt;code&gt;./variable-demo4.sh hello world&lt;/code&gt;  ，然后在脚本中通过  &lt;code&gt;$1&lt;/code&gt; 、 &lt;code&gt;$2&lt;/code&gt;  ... 读取第 1 个参数、第 2 个参数。。。&lt;/p&gt;
&lt;h3 id=&#34;函数处理参数&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#函数处理参数&#34;&gt;#&lt;/a&gt; 函数处理参数&lt;/h3&gt;
&lt;p&gt;另外，还有几个特殊字符用来处理参数：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数处理&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回参数个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回所有参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;脚本运行的当前进程 ID 号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;后台运行的最后一个进程的 ID 号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回所有参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;返回 Shell 使用的当前选项，与 set 命令功能相同。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;函数返回值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function-name function&#34;&gt;runner&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;zp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function-name function&#34;&gt;paramsFunction&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;函数第一个入参：&lt;span class=&#34;token variable&#34;&gt;$1&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;函数第二个入参：&lt;span class=&#34;token variable&#34;&gt;$2&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;传递到脚本的参数个数：&lt;span class=&#34;token variable&#34;&gt;$#&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;所有参数：&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$*&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;脚本运行的当前进程 ID 号：&lt;span class=&#34;token variable&#34;&gt;$$&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;后台运行的最后一个进程的 ID 号：&lt;span class=&#34;token variable&#34;&gt;$!&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;所有参数：&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+ %s&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$@&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Shell 使用的当前选项：$-&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  runner&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;runner 函数的返回值：&lt;span class=&#34;token variable&#34;&gt;$?&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;paramsFunction &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;abc&#34;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hello, &lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;zp&lt;span class=&#34;token entity&#34; title=&#34;\&amp;quot;&#34;&gt;\&#34;&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  函数第一个入参：1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  函数第二个入参：abc&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  传递到脚本的参数个数：3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  所有参数：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + 1 abc hello, &#34;zp&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  脚本运行的当前进程 ID 号：26400&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  后台运行的最后一个进程的 ID 号：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  所有参数：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + 1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + abc&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + hello, &#34;zp&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Shell 使用的当前选项：hB&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  runner 函数的返回值：0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;shell-扩展&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#shell-扩展&#34;&gt;#&lt;/a&gt; Shell 扩展&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;扩展&lt;/em&gt; 发生在一行命令被分成一个个的 &lt;em&gt;记号（tokens）&lt;/em&gt; 之后。换言之，扩展是一种执行数学运算的机制，还可以用来保存命令的执行结果，等等。&lt;/p&gt;
&lt;p&gt;感兴趣的话可以阅读&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9iYXNoLmh0bWwjIyNTaGVsbC1FeHBhbnNpb25z&#34;&gt;关于 shell 扩展的更多细节&lt;/span&gt;。&lt;/p&gt;
&lt;h4 id=&#34;大括号扩展&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大括号扩展&#34;&gt;#&lt;/a&gt; 大括号扩展&lt;/h4&gt;
&lt;p&gt;大括号扩展让生成任意的字符串成为可能。它跟 &lt;em&gt;文件名扩展&lt;/em&gt; 很类似，举个例子：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; beg&lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;i,a,u&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;n &lt;span class=&#34;token comment&#34;&gt;### begin began begun&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;大括号扩展还可以用来创建一个可被循环迭代的区间。&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### 0 1 2 3 4 5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;00&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### 00 02 04 06 08&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;命令置换&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#命令置换&#34;&gt;#&lt;/a&gt; 命令置换&lt;/h4&gt;
&lt;p&gt;命令置换允许我们对一个命令求值，并将其值置换到另一个命令或者变量赋值表达式中。当一个命令被 `` 或 &lt;code&gt;$()&lt;/code&gt;  包围时，命令置换将会执行。举个例子：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; +%T&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;### or&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; +%T&lt;span class=&#34;token variable&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$now&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### 19:08:26&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;算数扩展&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#算数扩展&#34;&gt;#&lt;/a&gt; 算数扩展&lt;/h4&gt;
&lt;p&gt;在 bash 中，执行算数运算是非常方便的。算数表达式必须包在 &lt;code&gt;$(( ))&lt;/code&gt;  中。算数扩展的格式为：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$result&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### 9&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;在算数表达式中，使用变量无需带上 &lt;code&gt;$&lt;/code&gt;  前缀：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; y &lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;     &lt;span class=&#34;token comment&#34;&gt;### 11&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;x &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; y&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### 12&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;$((&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; y &lt;span class=&#34;token variable&#34;&gt;))&lt;/span&gt;&lt;/span&gt;     &lt;span class=&#34;token comment&#34;&gt;### 13&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;单引号和双引号-2&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#单引号和双引号-2&#34;&gt;#&lt;/a&gt; 单引号和双引号&lt;/h4&gt;
&lt;p&gt;单引号和双引号之间有很重要的区别。在双引号中，变量引用或者命令置换是会被展开的。在单引号中是不会的。举个例子：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Your home: &lt;span class=&#34;token environment constant&#34;&gt;$HOME&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### Your home: /Users/&amp;lt;username&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;Your home: $HOME&#39;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### Your home: $HOME&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;当局部变量和环境变量包含空格时，它们在引号中的扩展要格外注意。随便举个例子，假如我们用 &lt;code&gt;echo&lt;/code&gt;  来输出用户的输入：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;INPUT&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;A string  with   strange    whitespace.&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$INPUT&lt;/span&gt;   &lt;span class=&#34;token comment&#34;&gt;### A string with strange whitespace.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$INPUT&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### A string  with   strange    whitespace.&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;调用第一个 &lt;code&gt;echo&lt;/code&gt;  时给了它 5 个单独的参数 ——  &lt;code&gt;$INPUT&lt;/code&gt;  被分成了单独的词， &lt;code&gt;echo&lt;/code&gt;  在每个词之间打印了一个空格。第二种情况，调用 &lt;code&gt;echo&lt;/code&gt;  时只给了它一个参数（整个 $INPUT 的值，包括其中的空格）。&lt;/p&gt;
&lt;p&gt;来看一个更严肃的例子：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token assign-left variable&#34;&gt;FILE&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;Favorite Things.txt&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$FILE&lt;/span&gt;   &lt;span class=&#34;token comment&#34;&gt;### 尝试输出两个文件: `Favorite` 和 `Things.txt`&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token variable&#34;&gt;$FILE&lt;/span&gt;&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;### 输出一个文件: `Favorite Things.txt`&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;尽管这个问题可以通过把 FILE 重命名成 &lt;code&gt;Favorite-Things.txt&lt;/code&gt;  来解决，但是，假如这个值来自某个环境变量，来自一个位置参数，或者来自其它命令（ &lt;code&gt;find&lt;/code&gt; ,  &lt;code&gt;cat&lt;/code&gt; , 等等）呢。因此，如果输入 &lt;em&gt;可能&lt;/em&gt; 包含空格，务必要用引号把表达式包起来。&lt;/p&gt;
&lt;h2 id=&#34;流和重定向&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#流和重定向&#34;&gt;#&lt;/a&gt; 流和重定向&lt;/h2&gt;
&lt;p&gt;Bash 有很强大的工具来处理程序之间的协同工作。使用流，我们能将一个程序的输出发送到另一个程序或文件，因此，我们能方便地记录日志或做一些其它我们想做的事。&lt;/p&gt;
&lt;p&gt;管道给了我们创建传送带的机会，控制程序的执行成为可能。&lt;/p&gt;
&lt;p&gt;学习如何使用这些强大的、高级的工具是非常非常重要的。&lt;/p&gt;
&lt;h3 id=&#34;输入-输出流&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#输入-输出流&#34;&gt;#&lt;/a&gt; 输入、输出流&lt;/h3&gt;
&lt;p&gt;Bash 接收输入，并以字符序列或 &lt;strong&gt;字符流&lt;/strong&gt; 的形式产生输出。这些流能被重定向到文件或另一个流中。&lt;/p&gt;
&lt;p&gt;有三个文件描述符：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;描述符&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;stdin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标准输入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;stdout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标准输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;stderr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标准错误输出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;重定向&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#重定向&#34;&gt;#&lt;/a&gt; 重定向&lt;/h3&gt;
&lt;p&gt;重定向让我们可以控制一个命令的输入来自哪里，输出结果到什么地方。这些运算符在控制流的重定向时会被用到：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;重定向输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;重定向输出和错误输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;amp;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;以附加的形式重定向输出和错误输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;重定向输入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3RsZHAub3JnL0xEUC9hYnMvaHRtbC9oZXJlLWRvY3MuaHRtbA==&#34;&gt;Here 文档&lt;/span&gt; 语法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy50bGRwLm9yZy9MRFAvYWJzL2h0bWwveDE3ODM3Lmh0bWw=&#34;&gt;Here 字符串&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以下是一些使用重定向的例子：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;### ls 的结果将会被写到 list.txt 中&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-l&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; list.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;### 将输出附加到 list.txt 中&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&gt;&lt;/span&gt; list.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;### 所有的错误信息会被写到 errors.txt 中&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; da * &lt;span class=&#34;token operator&#34;&gt;&lt;span class=&#34;token file-descriptor important&#34;&gt;2&lt;/span&gt;&gt;&lt;/span&gt; errors.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;### 从 errors.txt 中读取输入&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;less&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; errors.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;devnull-文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#devnull-文件&#34;&gt;#&lt;/a&gt;  &lt;code&gt;/dev/null&lt;/code&gt;  文件&lt;/h3&gt;
&lt;p&gt;如果希望执行某个命令，但又不希望在屏幕上显示输出结果，那么可以将输出重定向到 /dev/null：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ &lt;span class=&#34;token builtin class-name&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; /dev/null&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;/dev/null 是一个特殊的文件，写入到它的内容都会被丢弃；如果尝试从该文件读取内容，那么什么也读不到。但是 /dev/null 文件非常有用，将命令的输出重定向到它，会起到 &amp;quot;禁止输出&amp;quot; 的效果。&lt;/p&gt;
&lt;p&gt;如果希望屏蔽 stdout 和 stderr，可以这样写：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ &lt;span class=&#34;token builtin class-name&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&#34;token operator&#34;&gt;&lt;span class=&#34;token file-descriptor important&#34;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&#34;token file-descriptor important&#34;&gt;&amp;amp;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;debug&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#debug&#34;&gt;#&lt;/a&gt; Debug&lt;/h2&gt;
&lt;p&gt;shell 提供了用于 debug 脚本的工具。&lt;/p&gt;
&lt;p&gt;如果想采用 debug 模式运行某脚本，可以在其 shebang 中使用一个特殊的选项：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash options
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;options 是一些可以改变 shell 行为的选项。下表是一些可能对你有用的选项：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Short&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;noglob&lt;/td&gt;
&lt;td&gt;禁止文件名展开（globbing）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;interactive&lt;/td&gt;
&lt;td&gt;让脚本以 &lt;em&gt;交互&lt;/em&gt; 模式运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;noexec&lt;/td&gt;
&lt;td&gt;读取命令，但不执行（语法检查）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;执行完第一条命令后退出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;verbose&lt;/td&gt;
&lt;td&gt;在执行每条命令前，向 &lt;code&gt;stderr&lt;/code&gt;  输出该命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;xtrace&lt;/td&gt;
&lt;td&gt;在执行每条命令前，向 &lt;code&gt;stderr&lt;/code&gt;  输出该命令以及该命令的扩展参数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;举个例子，如果我们在脚本中指定了 &lt;code&gt;-x&lt;/code&gt;  例如：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/bin/bash -x&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$i&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;这会向 &lt;code&gt;stdout&lt;/code&gt;  打印出变量的值和一些其它有用的信息：&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$ ./my_script&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;  &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;  &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token builtin class-name&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;  &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;+ &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;有时我们值需要 debug 脚本的一部分。这种情况下，使用 &lt;code&gt;set&lt;/code&gt;  命令会很方便。这个命令可以启用或禁用选项。使用 &lt;code&gt;-&lt;/code&gt;  启用选项， &lt;code&gt;+&lt;/code&gt;  禁用选项：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 『示例源码』&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;figcaption data-lang=&#34;Bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 开启 debug&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-x&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;((&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;  &lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;i&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 关闭 debug&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;set&lt;/span&gt; +x&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + (( i = 0 ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + (( i &amp;lt; 3 ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + printf 0&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  0+ (( i++  ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + (( i &amp;lt; 3 ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + printf 1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  1+ (( i++  ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + (( i &amp;lt; 3 ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + printf 2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  2+ (( i++  ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + (( i &amp;lt; 3 ))&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  + set +x&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token for-or-select variable&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$&amp;#123;i&amp;#125;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token builtin class-name&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&lt;span class=&#34;token entity&#34; title=&#34;\n&#34;&gt;\n&lt;/span&gt;&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#  Output: 12345&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#参考资料&#34;&gt;#&lt;/a&gt; 参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2FsZWJjYXkvYXdlc29tZS1zaGVsbA==&#34;&gt;awesome-shell&lt;/span&gt; - shell 资源列表&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2F3ZXNvbWUtbGlzdHMvYXdlc29tZS1iYXNo&#34;&gt;awesome-bash&lt;/span&gt; - bash 资源列表&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2RlbnlzZG92aGFuL2Jhc2gtaGFuZGJvb2s=&#34;&gt;bash-handbook&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL3Z1dWloYy9iYXNoLWd1aWRl&#34;&gt;bash-guide&lt;/span&gt; - bash 基本用法指南&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL0Jhc2gtaXQvYmFzaC1pdA==&#34;&gt;bash-it&lt;/span&gt; - 为你日常使用、开发以及维护 shell 脚本和自定义命令提供了一个可靠的框架&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL2RvdGZpbGVzLmdpdGh1Yi5pby8=&#34;&gt;dotfiles.github.io&lt;/span&gt; - 上面有 bash 和其它 shell 的各种 dotfiles 集合以及 shell 框架的链接&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy5ydW5vb2IuY29tL2xpbnV4L2xpbnV4LXNoZWxsLmh0bWw=&#34;&gt;Runoob Shell 教程&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2tvYWxhbWFuL3NoZWxsY2hlY2s=&#34;&gt;shellcheck&lt;/span&gt; - 一个静态 shell 脚本分析工具，本质上是 bash／sh／zsh 的 lint。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后，Stack Overflow 上 &lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvdGFnZ2VkL2Jhc2g=&#34;&gt;bash 标签下&lt;/span&gt;有很多你可以学习的问题，当你遇到问题时，也是一个提问的好地方。&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/61108/</guid>
            <title>《华为是怎样对待供应商的》</title>
            <link>https://metal-heart.github.io/posts/61108/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="职场" scheme="https://metal-heart.github.io/categories/work/Workplace/" />
            <category term="硬件设计" scheme="https://metal-heart.github.io/tags/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/" />
            <category term="供应商" scheme="https://metal-heart.github.io/tags/%E4%BE%9B%E5%BA%94%E5%95%86/" />
            <category term="华为" scheme="https://metal-heart.github.io/tags/%E5%8D%8E%E4%B8%BA/" />
            <pubDate>Wed, 12 Oct 2022 10:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;解读华为是怎样对待供应商的&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#解读华为是怎样对待供应商的&#34;&gt;#&lt;/a&gt; 解读《华为是怎样对待供应商的》&lt;/h1&gt;
&lt;h1 id=&#34;采购杠杆&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#采购杠杆&#34;&gt;#&lt;/a&gt; 采购杠杆&lt;/h1&gt;
&lt;p&gt;按物料族进行采购运作的目的是在全球范围内利用华为的采购杠杆。&lt;br /&gt;
这个应该很好理解：&lt;br /&gt;
即使是华为，其一个产品使用某个器件的量是有限的。他们有些项目的发货量也是非常小的。&lt;br /&gt;
但是其项目比较多、多个项目都使用同一种物料，所产生的累加在一起的数量，也是让供应商非常兴奋的数量。&lt;br /&gt;
从开发者的角度，在器件选型的时候，应该是考虑其他项目、其他产品已经在使用自己所需要的物料了，尽量考虑已经采购和使用的物料。&lt;br /&gt;
这个情况，在很多开发规模不大的公司很容易出现问题，大家按照自己的认知和想法随意选择新型号的器件。导致：&lt;br /&gt;
a、重复设计，相同功能的电路&lt;strong&gt;重复设计多次&lt;/strong&gt;。&lt;br /&gt;
b、技术不能得到积累，多个人、多个产品相互之间复用的电路、模块太少，每次开发都是新的人力投入；&lt;strong&gt;相互之间的电路不能够得到借鉴&lt;/strong&gt;。&lt;br /&gt;
c、&lt;strong&gt;相同的功能，选用不同的器件，造成大量的库存，大量的浪费&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以，华为采取了以下几个措施，进行规避以上问题：&lt;br /&gt;
a、&lt;strong&gt;新器件不允许轻易的引入，需要经过复杂的评审，重复论证其必要性&lt;/strong&gt;。新引入一个器件的成本按照 10 万美金进行评估其综合成本。&lt;br /&gt;
b、电路&lt;strong&gt;设计要求：归一化、简洁度&lt;/strong&gt;&lt;br /&gt;
归一化：减少器件种类，作为一个专门的措施，在项目流程中对电路进行审视。&lt;br /&gt;
简洁度：器件管脚数量 / 器件的个数，用于考核是否使用了大量不必要的阻容等器件。&lt;br /&gt;
c、CBB  共用基础模块（Common Building Blocks, CBB）指那些可以在不同产品、系统之间共用的零部件、模块、技术及其他相关的设计成果。由于部门之间共享已有成果的程度很低，随着产品种类的不断增长，零部件、支持系统、供应商也在持续增长，这将导致一系列问题。事实上，不同产品、系统之间，存在许多可以共用的零部件、模块和技术，如果产品在开发中尽可能多地采用了这些成熟的共用基础模块和技术，无疑这一产品的质量、进度和成本会得到很好的控制和保证，产品开发中的技术分险也将大为降低。因此，通过产品重整，建立 CBB 数据库，实现技术、模块、子系统、零部件在不同产品之间的重用和共享，可以缩短产品开发周期、降低产品成本。 CBB 策略的实施需要组织结构和衡量标准的保证。&lt;br /&gt;
CBB 电路：指不同设计平台，不同项目之间共用的电路模块、PCB 布局、走线及其它相关的设计成果，CBB 电路分为原理图模块和 PCB 模块两部分。&lt;/p&gt;
&lt;p&gt;有一次，任正非 开会，问一名副总裁：“你的产品有百分之多少是自己开发的呀？&lt;/p&gt;
&lt;p&gt;” 这位副总裁非常骄傲的说：“我们的产品，&lt;strong&gt;有 80% 都是自己开发的，20% 是公司现有模块”。任正非非常生气，骂他：“你这个老农民”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;又问另一个副总裁:“你的产品有百分之多少是自己开发的呀？”&lt;/p&gt;
&lt;p&gt;这位副总裁说：“&lt;strong&gt;我们的产品 60% 是自己开发的，40% 是公司现有的模块。” 任正非点点头：“你是农民企业家。&lt;/strong&gt;”（开始学会整合资源了。）&lt;/p&gt;
&lt;p&gt;又问另一个副总裁:“你的产品有百分之多少是自己开发的呀？”&lt;/p&gt;
&lt;p&gt;这位副总裁说:” 我们的产品&lt;strong&gt; 40% 是自己开发的，60% 是公司现有模块。” 任总非常高兴：“你才是真正的企业家&lt;/strong&gt;。”&lt;/p&gt;
&lt;p&gt;华为早期的螺钉就有 2000 多种。为什么呢？研发人员讲究” 创新”。他设计一个直角螺钉，我就设计一个卯角的，另外一个哥们看我设计卯角的，他就设计一个弯角的，反正和你们的都不一样，体现自己的独特性。这种创新有没有必要呢？答案显然不是。因此，华为后期通过对 CBB 共享模块进行梳理，发现只需要 200 多种螺钉。由于设计人员无谓的 “创新”，导致公司物料编码很多，很多物料采购量有很少，一是增加了采购部门的工作量，另一方面，由于我们采购的很少，因此，采购的议价就没有优势，导致很多物料的采购价格偏高。&lt;/p&gt;
&lt;p&gt;IBM 数据表明，如果公司建立规范化的 CBB 共享平台，在产品设计过程中尽量&lt;strong&gt;选用平台库中的部件和物料，料号减少了 30%，供应商从 5000 多家减少到 1200 多家，共享的开发费用从 2% 增加到 20%，减少 50 亿美元的库存成本，每年节约持有成本 5 亿美元，节约劳动节约了研发成本和制造成本，还保证了产品的质量&lt;/strong&gt;，可以说是一个一劳永逸的战略部署。&lt;/p&gt;
&lt;p&gt;华为在 2017、2016 年芯片的采购额度在 140 亿美金左右，世界排名第五。&lt;/p&gt;
&lt;p&gt;单位：百万美元。BBK = 步步高。&lt;/p&gt;
&lt;p&gt;所谓 “客大欺店”：华为因为其采购的体量足够大，只要运作的好，可以足够的主动权去控制供应链的价格。&lt;br /&gt;
在利用上面的一些步骤，可以足以让某一型号的物料形成海量的采购，让芯片的价格最终跟沙子一样。&lt;/p&gt;
&lt;p&gt;杠杆也有撬不动的时候&lt;br /&gt;
有些器件，由于芯片厂家的技术壁垒，导致独家供货，使得即使华为这样的厂家也没有了议价权：&lt;br /&gt;
例如：Intel、三星、高通等厂家。&lt;/p&gt;
&lt;p&gt;三星自主生产的尖端电子件，除了给自家用外，还向其它厂商供货，再看看华为公司，今年从韩国供应链采购金额就高达 5.3 万亿韩元，约 311 亿人民币！&lt;br /&gt;
 华为公司一年从韩国采购的产品价值就达到了公司营收的 1/5 左右了。&lt;/p&gt;
&lt;p&gt;而且采购之时还要看三星 SK Hynix 等韩国公司的脸色，倘若搞的他们不开心还会出现限供或不供的局面。就拿三星屏来说，三星把最好的屏都留给自己用，过时或自己觉得不好的东西才给你！早期国产手机中兴 Vivo  金立等众多厂商由于手机屏货源紧张而到处奔波，寻求上游厂商支持，试图从这些屏厂商中&lt;strong&gt;获得足够量的显示屏。除了手机屏还是闪存  内存等等一系列尖端产品，你都要绞尽脑汁与上游厂商搞好关系，才能在后序生产中保证配件货源的稳定！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当单一器件不具备可以替代性，所以华为会针对这种独家供货采取很多手段：&lt;br /&gt;
1、扶持一家竞争对手，例如针对 Intel，会做一些针对 AMD 的性能测试、验证、甚至产品开发；针对 Intel，或研发和使用多核 ARM 的服务器，哪怕生态不成熟，哪怕困难重重，但是也需要提早做好准备，避免类似特朗普封杀中兴的事件。&lt;br /&gt;
2、自研芯片逐步解决供货的问题。&lt;br /&gt;
3、针对低附加值行业，尽早指定芯片布局，形成高端玩法，&lt;strong&gt;当设备不赚钱的时候，靠销售芯片&lt;/strong&gt;，或者依托芯片本身的技术壁垒，形成高附加值的护城河。&lt;br /&gt;
例如，安防、wifi、光网络、手机、无线基站。都通过芯片布局，形成壁垒和优势。这种布局，一是长期积累的芯片设计能力，二是投入大，本身从资本层面就已经形成了保护。&lt;/p&gt;
&lt;h1 id=&#34;华为92家供应商&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#华为92家供应商&#34;&gt;#&lt;/a&gt; 华为 92 家供应商&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;供应商&lt;/th&gt;
&lt;th&gt;总部&lt;/th&gt;
&lt;th&gt;供应产品及业务&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;英特尔&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;计算和存储等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;恩智浦&lt;/td&gt;
&lt;td&gt;荷兰&lt;/td&gt;
&lt;td&gt;NFC 芯片及音频放大器 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;灝讯&lt;/td&gt;
&lt;td&gt;瑞士&lt;/td&gt;
&lt;td&gt;射频连接器和光学连接元件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;赛灵思&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;FPGA 芯片及视频编码器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;美满&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;存储、网络和无线连接解决方案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;富士康&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;代工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生益电子&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;PCB (印刷线路板〉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中利集团&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;线缆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;富士通&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;硬盘驱动器、大移动硬盘等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;沪士电子&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;PCB 产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;美光&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;存储产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;广濑&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;连接器及相关组件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;比亚迪&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;手机结构件、组装、电池、充电器等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;村田&lt;/td&gt;
&lt;td&gt;日本&lt;/td&gt;
&lt;td&gt;滤波器和 MLCC 等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;索尼&lt;/td&gt;
&lt;td&gt;日本&lt;/td&gt;
&lt;td&gt;手机摄像头及相关模组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大立光电&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;手机镜头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高通&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;调制调解芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;亚德诺&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;模拟与数字倍号处理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;康沃&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;数据保护解决方案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安费诺&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;连接器及线缆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;立讯精密&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;连接器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;欣兴电子&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;电路板 PC8、集成电辂 载板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;莫仕&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;连接器与线缆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;耐克森&lt;/td&gt;
&lt;td&gt;法国&lt;/td&gt;
&lt;td&gt;线缆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;京东方&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;显示屏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阳天电子&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;温控设备、通信整机 、TOP 级的结构件等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中航光电&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;线缆与连接器物料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;甲骨文&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;软件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;住友电工&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;光通佶信器件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安森美&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;光学防抖、自动对焦 、可调谐射頻器件、摄像机和充电器的电源管理集成屯路解决方案以及保护器件等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中远海运集团&lt;/td&gt;
&lt;td colspan=&#34;2&#34;&gt;中国大陆&lt;/td&gt;
&lt;td&gt;货物运鍮&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;顺丰速通&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;货物运输&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中国外运&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;货物运输&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新能源科技有限公司&lt;/td&gt;
&lt;td&gt;中国香港&lt;/td&gt;
&lt;td&gt;电池类产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;舜宇光学&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;摄像头模组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;天马&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;屏幕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SK 海力士&lt;/td&gt;
&lt;td&gt;韩国&lt;/td&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;罗德与施瓦茨&lt;/td&gt;
&lt;td&gt;德国&lt;/td&gt;
&lt;td&gt;从产品开发到产线无缝衔接的 NB-loT 测试方案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是徳科技&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;SG 技术的测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;美国国际集团&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;保险、金融、投资及资产管理等服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;思博沦&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;验证测试业务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;红帽&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;开期软件和技术&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUSE&lt;/td&gt;
&lt;td&gt;德国&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;晶技股份&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;石英英荡器及表面声波振荡器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;东芝存储&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;从硬盘 (HDD)、固态混合硬盘 SSHD 和固态硬盘 SSD 到 NAND 闪存的各种存储技术&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;希捷&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;高速硬盘以及闪存等 解决方案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;西部数椐&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;创新的存储技术和硬盘产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;光迅科技&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;光模块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;迅达科技&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;PCB 及相关产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新思科技&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;人工智能手机芯片以及软件安全评估&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;华工科技&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;5G 光模块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长飞&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;光纤光缆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;意法半导体&lt;/td&gt;
&lt;td&gt;瑞士&lt;/td&gt;
&lt;td&gt;MCU、MEMS 传感器及 NB-IoT 开发板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;思佳迅&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;射频芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;微软&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;翻译技术&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;深南电路&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;无线通讯基站用 PCB 在内的各类产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新飞通&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;光通讯产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qorvo&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;RF 解决方案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;古河电工&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;光纤、电线电缆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;瑞声科技&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;声学器件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;联恩电子&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;光纤接入产品和视频编码器芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sumicem&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;UNbO3 调制器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;歌尔股份&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;声学精密零组件和智能硬件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;华通电脑&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;PCB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三菱电机&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;电机产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;三星&lt;/td&gt;
&lt;td&gt;韩国&lt;/td&gt;
&lt;td&gt;OLED 辟幕及内存 / 闪存 产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;南亚科技&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;存储芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;赛普拉斯&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;传感器 (三轴加速度计&amp;gt; 、BST 电容控制器等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高意&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;光电产品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inphl&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;半导体组件和光学子系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;松下&lt;/td&gt;
&lt;td&gt;曰本&lt;/td&gt;
&lt;td&gt;电子材料、电子元器件、电池、汽车电子设备、工厂和工业自动化设备及方案等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;航嘉&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;消费电源核心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;旺宏电子&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;高端 NOR Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;华勒通讯&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;0DM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;台积电&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;晶圆代工&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;核达中远通&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;电源及相关祖件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;风河&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;VxWorks 嫌作系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;亨通光电&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;通信产品及系统解决方案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;曰月光集团&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;封测业务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;联发科&lt;/td&gt;
&lt;td&gt;中国台湾&lt;/td&gt;
&lt;td&gt;低端手机芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;蓝思科技&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;玻璃前盖、后盖、摄像头、TP、装饰件等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中芯国际&lt;/td&gt;
&lt;td&gt;中国大陆&lt;/td&gt;
&lt;td&gt;生产电源管理芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;伟创力&lt;/td&gt;
&lt;td&gt;新加坡&lt;/td&gt;
&lt;td&gt;组装业务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;罗森伯格&lt;/td&gt;
&lt;td&gt;德国&lt;/td&gt;
&lt;td&gt;无线射频和光纤通信技术&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;伯恩光学&lt;/td&gt;
&lt;td&gt;中国香港&lt;/td&gt;
&lt;td&gt;玻璃盖板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lumeotum&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;光学元件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;菲尼萨&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;光器件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;铿腾电子&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;EDA 软件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;博通&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;WIFI+BT 模块、定位中枢芯片、射频天线开关等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;德州仪器&lt;/td&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;DSP 和模拟芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;英飞凌&lt;/td&gt;
&lt;td&gt;德国&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/27650/</guid>
            <title>《Git知识点整理》</title>
            <link>https://metal-heart.github.io/posts/27650/</link>
            <category term="工具" scheme="https://metal-heart.github.io/categories/Tool/" />
            <category term="Git" scheme="https://metal-heart.github.io/categories/Tool/Git/" />
            <category term="LINUX" scheme="https://metal-heart.github.io/tags/LINUX/" />
            <category term="SOFTWARE" scheme="https://metal-heart.github.io/tags/SOFTWARE/" />
            <category term="GIT" scheme="https://metal-heart.github.io/tags/GIT/" />
            <category term="软件工具" scheme="https://metal-heart.github.io/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E5%85%B7/" />
            <pubDate>Wed, 12 Oct 2022 10:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;1-git基本概念&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-git基本概念&#34;&gt;#&lt;/a&gt; 1. Git 基本概念。&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;repository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;branch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;head&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;merge&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conflict&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;diff&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-git工作空间和文件状态&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-git工作空间和文件状态&#34;&gt;#&lt;/a&gt; 2. Git 工作空间和文件状态&lt;/h2&gt;
&lt;h3 id=&#34;1工作空间&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1工作空间&#34;&gt;#&lt;/a&gt; (1). 工作空间&lt;/h3&gt;
&lt;p&gt;&lt;img data-src=&#34;http://blog.chinaunix.net/attachment/201402/19/10415985_139279770639pM.jpg&#34; alt=&#34;Git工作空间&#34; /&gt;&lt;/p&gt;
&lt;p&gt;左侧为工作区，右侧为版本库。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工作区（ &lt;code&gt;Working Directory&lt;/code&gt; ） 就是在电脑里能看到的目录，比如 learngit 文件夹就是一个工作区。&lt;/li&gt;
&lt;li&gt;版本库（ &lt;code&gt;Repository&lt;/code&gt; ）工作区有一个隐藏目录 &lt;code&gt;.git&lt;/code&gt; ，是 Git 的版本库。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在版本库中标记为 &lt;code&gt;index&lt;/code&gt;  的区域为暂存区，标记为 &lt;code&gt;master&lt;/code&gt;  的是 Git 为我们自动创建的第一个分支，代表的是目录树。此时 &lt;code&gt;HEAD&lt;/code&gt;  实际是指向 &lt;code&gt;master&lt;/code&gt;  分支的一个 “游标”，所以图示的命令中出现 HEAD 的地方可以用 &lt;code&gt;master&lt;/code&gt;  来替换。图中的 objects 标识的区域为 git 的对象库，实际位于 &lt;code&gt;.git/objects&lt;/code&gt;  目录下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当对工作区修改（或新增）的文件执行 &lt;code&gt;git add&lt;/code&gt;  命令时，暂存区的目录树会被更新，同时工作区修改（或新增）的文件内容会被写入到对象库中的一个新的对象中，而该对象的 id 被记录在暂存区的文件索引中。&lt;/li&gt;
&lt;li&gt;当执行提交操作 &lt;code&gt;git commit&lt;/code&gt;  时，暂存区的目录树会写到版本库（对象库）中，master 分支会做相应的更新，即 master 最新指向的目录树就是提交时原暂存区的目录树。&lt;/li&gt;
&lt;li&gt;当执行 &lt;code&gt;git reset HEAD&lt;/code&gt;  命令时，暂存区的目录树会被重写，会被 master 分支指向的目录树所替换，但是工作区不受影响。&lt;/li&gt;
&lt;li&gt;当执行 &lt;code&gt;git rm --cached&lt;/code&gt;  命令时，会直接从暂存区删除文件，工作区则不做出改变。&lt;/li&gt;
&lt;li&gt;当执行 &lt;code&gt;git checkout .&lt;/code&gt;  或 &lt;code&gt;git checkout --&lt;/code&gt;  命令时，会用暂存区全部的文件或指定的文件替换工作区的文件。这个操作很危险，会清楚工作区中未添加到暂存区的改动。&lt;/li&gt;
&lt;li&gt;当执行 &lt;code&gt;git checkout HEAD .&lt;/code&gt;  或 &lt;code&gt;git checkout HEAD&lt;/code&gt;  命令时，会用 HEAD 指向的 master 分支中的全部或部分文件替换暂存区和工作区中的文件。这个命令也是极度危险的。因为不但会清楚工作区中未提交的改动，也会清楚暂存区中未提交的改动。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1文件状态&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1文件状态&#34;&gt;#&lt;/a&gt; (1). 文件状态&lt;/h3&gt;
&lt;p&gt;Git 有三种状态，你的文件可能处于其中之一：&lt;strong&gt;已提交 ( &lt;code&gt;committed&lt;/code&gt; )&lt;/strong&gt;、&lt;strong&gt;已修改 ( &lt;code&gt;modified&lt;/code&gt; )&lt;strong&gt; 和&lt;/strong&gt;已暂存 ( &lt;code&gt;staged&lt;/code&gt; )&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;3-git配置系统级-全局-当前仓库用户名-邮箱的命令&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-git配置系统级-全局-当前仓库用户名-邮箱的命令&#34;&gt;#&lt;/a&gt; 3. Git 配置系统级、全局、当前仓库用户名、邮箱的命令&lt;/h2&gt;
&lt;p&gt;系统级、全局、当前仓库选项分别是：仓库 - system、-global、-local (或默认不填)&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; config &lt;span class=&#34;token parameter variable&#34;&gt;--global&lt;/span&gt; user.name &lt;span class=&#34;token string&#34;&gt;&#34;Jerry Mouse&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; config &lt;span class=&#34;token parameter variable&#34;&gt;--global&lt;/span&gt; user.email &lt;span class=&#34;token string&#34;&gt;&#34;jerry@yiibai.com&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;列出 Git 设置&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; config &lt;span class=&#34;token parameter variable&#34;&gt;--list&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; config &lt;span class=&#34;token parameter variable&#34;&gt;-l&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;4-git-fetch和pull的区别&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4-git-fetch和pull的区别&#34;&gt;#&lt;/a&gt; 4. Git fetch 和 pull 的区别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git fetch&lt;/code&gt; ：相当于是从远程获取最新版本到本地，不会自动 merge.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; ：相当于是从远程获取最新版本并 merge 到本地.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-git-fetch示例&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-git-fetch示例&#34;&gt;#&lt;/a&gt; (1). git fetch 示例：&lt;/h3&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Git fetch origin master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; log &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; master&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;origin/master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge origin/master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;以上命令的含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先从远程的 &lt;code&gt;origin&lt;/code&gt;  的 &lt;code&gt;master&lt;/code&gt;  主分支下载最新的版本到 &lt;code&gt;origin/master&lt;/code&gt;  分支上&lt;/li&gt;
&lt;li&gt;然后比较本地的 &lt;code&gt;master&lt;/code&gt;  分支和 &lt;code&gt;origin/master&lt;/code&gt;  分支的差别&lt;/li&gt;
&lt;li&gt;最后进行合并&lt;/li&gt;
&lt;li&gt;上述过程其实可以用以下更清晰的方式来进行：&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-git-pull示例&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-git-pull示例&#34;&gt;#&lt;/a&gt; (1). git pull 示例：&lt;/h3&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; pull origin master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;上述命令其实相当于 &lt;code&gt;git fetch&lt;/code&gt;  和 &lt;code&gt;git merge&lt;/code&gt; 。在实际使用中， &lt;code&gt;git fetch&lt;/code&gt;  更安全一些，因为在 merge 前，我们可以查看更新情况，然后再决定是否合并。&lt;/p&gt;
&lt;h2 id=&#34;5-git-reset和revert的却别&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5-git-reset和revert的却别&#34;&gt;#&lt;/a&gt; 5. Git reset 和 revert 的却别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git revert&lt;/code&gt;  是用一次新的 commit 来回滚之前的 commit， &lt;code&gt;git reset&lt;/code&gt;  是直接删除指定的 commit。&lt;/li&gt;
&lt;li&gt;在回滚这一操作上看，效果差不多。但是在日后继续 merge 以前的老版本时有区别。因为 &lt;code&gt;git revert&lt;/code&gt;  是用一次逆向的 commit “中和” 之前的提交，因此日后合并老的 branch 时，导致这部分改变不会再次出现，但是 &lt;code&gt;git reset&lt;/code&gt;  是之间把某些 commit 在某个 branch 上删除，因而和老的 branch 再次 merge 时，这些被回滚的 commit 应该还会被引入。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reset&lt;/code&gt;  是把 HEAD 向后移动了一下，而 &lt;code&gt;git revert&lt;/code&gt;  是 HEAD 继续前进，只是新的 commit 的内容和要 revert 的内容正好相反，能够抵消要被 revert 的内容。&lt;/li&gt;
&lt;li&gt;git revert 与 git reset 最大的不同是，git revert 仅仅是撤销某次提交。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，说一下 &lt;code&gt;git revert&lt;/code&gt; ，  &lt;code&gt;git reset –hard&lt;/code&gt;  和  &lt;code&gt;–soft&lt;/code&gt;  的区别&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git reset –mixed id&lt;/code&gt; : 是将 git 的 HEAD 变了（也就是提交记录变了），但文件并没有改变，（也就是 working tree 并没有改变）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reset –soft id&lt;/code&gt; : 实际上，是 &lt;code&gt;git reset –mixed id&lt;/code&gt;  后，又做了一次 &lt;code&gt;git add&lt;/code&gt; 。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git reset –herd id&lt;/code&gt; : 是将 git 的 HEAD 变了，文件也变了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;6-git-merge和reabse的相同点和不同点&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#6-git-merge和reabse的相同点和不同点&#34;&gt;#&lt;/a&gt; 6. Git merge 和 reabse 的相同点和不同点&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;merge&lt;/code&gt;  是合并的意思， &lt;code&gt;rebase&lt;/code&gt;  是复位基底的意思，相同点都是用来合并分支的。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;http://images2015.cnblogs.com/blog/759200/201608/759200-20160806092734215-279978821.png&#34; alt=&#34;merge和rebase&#34; /&gt;&lt;/p&gt;
&lt;p&gt;不同点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;merge&lt;/code&gt;  操作会生成一个新的节点，之前的提交分开显示。而 &lt;code&gt;rebase&lt;/code&gt;  操作不会生成新的节点，是将两个分支融合成一个线性的提交。&lt;/li&gt;
&lt;li&gt;解决冲突时。merge 操作遇到冲突的时候，当前 merge 不能继续进行下去。手动修改冲突内容后，add 修改，commit 就可以了。而 &lt;code&gt;rebase&lt;/code&gt;  操作的话，会中断 rebase, 同时会提示去解决冲突。解决冲突后，将修改 add 后执行 &lt;code&gt;git rebase –continue&lt;/code&gt;  继续操作，或者 &lt;code&gt;git rebase –skip&lt;/code&gt;  忽略冲突。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt;  和 &lt;code&gt;git pull --rebase&lt;/code&gt;  区别： &lt;code&gt;git pull&lt;/code&gt;  做了两个操作分别是 &amp;quot;获取&amp;quot; 和 &amp;quot;合并&amp;quot;。所以加了 rebase 就是以 rebase 的方式进行合并分支，默认为 merge。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：选择 merge 还是 rebase？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;merge 是一个合并操作，会将两个分支的修改合并在一起，默认操作的情况下会提交合并中修改的内容&lt;/li&gt;
&lt;li&gt;merge 的提交历史忠实地记录了实际发生过什么，关注点在真实的提交历史上面&lt;/li&gt;
&lt;li&gt;rebase 并没有进行合并操作，只是提取了当前分支的修改，将其复制在了目标分支的最新提交后面&lt;/li&gt;
&lt;li&gt;rebase 的提交历史反映了项目过程中发生了什么，关注点在开发过程上面&lt;/li&gt;
&lt;li&gt;merge 与 rebase 都是非常强大的分支整合命令，没有优劣之分，使用哪一个应由项目和团队的开发需求决定&lt;/li&gt;
&lt;li&gt;merge 和 rebase 还有很多强大的选项，可以使用 git help &amp;lt;command&amp;gt; 查看&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;7-git-stash是什么它的相关使用方式命令&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#7-git-stash是什么它的相关使用方式命令&#34;&gt;#&lt;/a&gt; 7. Git stash 是什么？它的相关使用方式命令&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;git stash: 备份当前的工作区的内容，从最近的一次提交中读取相关内容，让工作区保证和上次提交的内容一致。同时，将当前的工作区内容保存到 Git 栈中。&lt;/li&gt;
&lt;li&gt;git stash pop: 从 Git 栈中读取最近一次保存的内容，恢复工作区的相关内容。由于可能存在多个 Stash 的内容，所以用栈来管理，pop 会从最近的一个 stash 中读取内容并恢复。&lt;/li&gt;
&lt;li&gt;git stash pop --index stash@{0}: 恢复编号为 0 的进度的工作区和暂存区。&lt;/li&gt;
&lt;li&gt;git stash apply stash@{1} 以将你指定版本号为 stash@{1} 的工作取出来&lt;/li&gt;
&lt;li&gt;git stash drop [&amp;lt;stash&amp;gt;] 删除某一个进度，默认删除最新进度&lt;/li&gt;
&lt;li&gt;git stash list: 显示 Git 栈内的所有备份，可以利用这个列表来决定从那个地方恢复。&lt;/li&gt;
&lt;li&gt;git stash clear: 清空 Git 栈。此时使用 gitg 等图形化工具会发现，原来 stash 的哪些节点都消失了&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 恢复工作进度&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; stash pop &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;--index&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;stash&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;--index&lt;/span&gt; 参数：不仅恢复工作区，还恢复暂存区&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;stash&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; 指定恢复某一个具体进度。如果没有这个参数，默认恢复最新进度&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 这是 git stash 保存进度的完整命令形式&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; stash &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;save message&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;-k&lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt;--no-keep-index&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;--patch&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;-k和--no-keep-index指定保存进度后，是否重置暂存区&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;--patch&lt;/span&gt; 会显示工作区和HEAD的差异,通过编辑差异文件，排除不需要保存的内容。和git &lt;span class=&#34;token function&#34;&gt;add&lt;/span&gt; -p命令类似&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;使用save可以对进度添加备注&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# git stash save &#34;这是保存的进度&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;8-git只从暂存区删除从工作空间删除的命令分别是什么&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#8-git只从暂存区删除从工作空间删除的命令分别是什么&#34;&gt;#&lt;/a&gt; 8. Git 只从暂存区删除，从工作空间删除的命令分别是什么？&lt;/h2&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--cached&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; commit&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;9-git标签的使用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#9-git标签的使用&#34;&gt;#&lt;/a&gt; 9. Git 标签的使用&lt;/h2&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 列出现有的标签&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; tag&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 打标签&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; tag &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt; v1.01 &lt;span class=&#34;token parameter variable&#34;&gt;-m&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Relase version 1.01&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看相应标签的版本信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; show v1.4&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ul&gt;
&lt;li&gt;-a 选项，创建一个含附注类型的标签&lt;/li&gt;
&lt;li&gt;-m 选项，指定了对应的标签说明&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;9-git分支的使用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#9-git分支的使用&#34;&gt;#&lt;/a&gt; 9. Git 分支的使用&lt;/h2&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看本地分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看远程分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建本地分支 (注意新分支创建后不会自动切换为当前分支)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 切换分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建新分支并立即切换到新分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout &lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 强制删除一个分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch &lt;span class=&#34;token parameter variable&#34;&gt;-D&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 合并分支 (将名称为 [name] 的分支与当前分支合并)&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看各个分支最后提交信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; br &lt;span class=&#34;token parameter variable&#34;&gt;-v&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看已经被合并到当前分支的分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; br &lt;span class=&#34;token parameter variable&#34;&gt;--merged&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看尚未被合并到当前分支的分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; br --no-merged&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;10-介绍git冲突处理经验以及merge和rebase中的ours和theirs的差别&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#10-介绍git冲突处理经验以及merge和rebase中的ours和theirs的差别&#34;&gt;#&lt;/a&gt; 10. 介绍 Git 冲突处理经验，以及 merge 和 rebase 中的 ours 和 theirs 的差别。&lt;/h2&gt;
&lt;p&gt;merge 和 rebase 对于 ours 和 theirs 的定义是完全相反的。在 merge 时，ours 指代的是当前分支，theirs 代表需要被合并的分支。而在 rebase 过程中，ours 指向了修改参考分支，theirs 却是当前分支。因为 rebase 隐含了一个 &lt;code&gt;git checkout upstream&lt;/code&gt;  的过程，将 &lt;code&gt;HEAD&lt;/code&gt;  从 local 分支变成了 upstream 分支。git 会在 rebase 结束后撤销这个改变，但它已经不可避免地影响了冲突的状态，使 rebase 中 ours 和 theirs 的定义与 merge 截然相反。因此，在使用 ours 与 theirs 时请格外小心。&lt;/p&gt;
&lt;h2 id=&#34;11-git远程操作相关&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#11-git远程操作相关&#34;&gt;#&lt;/a&gt; 11. Git 远程操作相关&lt;/h2&gt;
&lt;h3 id=&#34;1-clone&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-clone&#34;&gt;#&lt;/a&gt; (1). clone&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;git clone &amp;lt;版本库的网址&amp;gt;&lt;br /&gt;
git clone &amp;lt;版本库的网址&amp;gt; &amp;lt; 本地目录名 &amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 克隆 jQuery 的版本库&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; &lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; clone https://github.com/jquery/jquery.git&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; &lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; clone &lt;span class=&#34;token parameter variable&#34;&gt;-o&lt;/span&gt; jQuery https://github.com/jquery/jquery.git&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;2-remote&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-remote&#34;&gt;#&lt;/a&gt; (2). remote&lt;/h3&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 列出所有远程主机&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; remote&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 - v 选项，可以参看远程主机的网址&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; remote &lt;span class=&#34;token parameter variable&#34;&gt;-v&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 可以查看该主机的详细信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; remote show &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt; &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 添加远程主机&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; remote &lt;span class=&#34;token function&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;网址&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除远程主机&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; remote &lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 修改远程主机名称&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; remote &lt;span class=&#34;token function&#34;&gt;rename&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;原主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;新主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;3-fetch&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-fetch&#34;&gt;#&lt;/a&gt; (3). fetch&lt;/h3&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 取回所有分支 (branch) 的更新到本地&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; fetch &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;远程主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 取回某的特定分支的更新&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; fetch &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;远程主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;分支名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 取回 origin 主机的 master 分支的更新&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; fetch origin master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 所取回的更新，在本地主机上要用” 远程主机名 / 分支名” 的形式读取。比如 origin 主机的 master，就要用 origin/master 读取。可以使用 git merge 命令或者 git rebase 命令，在本地分支上合并远程分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge origin/master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; rebase origin/master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;4-pull&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4-pull&#34;&gt;#&lt;/a&gt; (4). pull&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;git pull &amp;lt;远程主机名&amp;gt; &amp;lt; 远程分支名 &amp;gt;:&amp;lt; 本地分支名 &amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 取回 origin 主机的 next 分支，与本地的 master 分支合并&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; pull origin next:master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如果远程分支是与当前分支合并，则冒号后面的部分可以省略。&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; pull origin next&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 上面的命令实质上等同于先做 git fetch，再做 git merge。&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; fetch origin&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge origin/next&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 合并需要采用 rebase 模式&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; pull &lt;span class=&#34;token parameter variable&#34;&gt;--rebase&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;远程主机名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;远程分支名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;:&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;本地分支名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h3 id=&#34;5-push&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5-push&#34;&gt;#&lt;/a&gt; (5). push&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;git push &amp;lt;远程主机名&amp;gt; &amp;lt; 本地分支名 &amp;gt;:&amp;lt; 远程分支名 &amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：分支推送顺序的写法是 &amp;quot;&amp;lt;来源地&amp;gt;:&amp;lt; 目的地 &amp;gt;&amp;quot;，所以 git pull 是 &amp;quot;&amp;lt; 远程分支 &amp;gt;:&amp;lt; 本地分支 &amp;gt;&amp;quot;，而 git push 是 &amp;quot;&amp;lt; 本地分支 &amp;gt;:&amp;lt; 远程分支 &amp;gt;&amp;quot;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果省略远程分支名，则表示将本地分支推送与之存在” 追踪关系” 的远程分支 (通常两者同名)，如果该远程分支不存在，则会被新建。&lt;/li&gt;
&lt;li&gt;如果省略本地分支名，则表示删除指定的远程分支，因为这等同于推送一个空的本地分支到远程分支。&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将本地的 master 分支推送到 origin 主机的 master 分支。如果后者不存在，则会被新建&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 省略了本地分支，以下等同，删除 origin 主机的 master 分支&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin :master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin &lt;span class=&#34;token parameter variable&#34;&gt;--delete&lt;/span&gt; master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如果当前分支与远程分支之间存在追踪关系，则本地分支和远程分支都可以省略&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如果当前分支只有一个追踪分支，那么主机名都可以省略。&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如果当前分支与多个主机存在追踪关系，则可以使用 - u 选项指定一个默认主机，这样后面就可以不加任何参数使用 git push&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt; origin master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 不管是否存在对应的远程分支，将本地的所有分支都推送到远程主机&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;--all&lt;/span&gt; origin&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 强制推送&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;--force&lt;/span&gt; origin&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# git push 不会推送标签 (tag)，除非使用–tags 选项&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin &lt;span class=&#34;token parameter variable&#34;&gt;--tags&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;12-git-flow使用简介&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#12-git-flow使用简介&#34;&gt;#&lt;/a&gt; 12. Git Flow 使用简介&lt;/h2&gt;
&lt;p&gt;就像代码需要代码规范一样，代码管理同样需要一个清晰的流程和规范。三种广泛使用的工作流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git flow&lt;/li&gt;
&lt;li&gt;Github flow&lt;/li&gt;
&lt;li&gt;Gitlab flow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三种工作流程，有一个共同点：都采用 &amp;quot;功能驱动式开发&amp;quot;（Feature-driven development，简称 FDD）。它指的是，需求是开发的起点，先有需求再有功能分支（feature branch）或者补丁分支（hotfix branch）。完成开发后，该分支就合并到主分支，然后被删除。最早诞生、并得到广泛采用的一种工作流程，就是&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL252aWUuY29tL3Bvc3RzL2Etc3VjY2Vzc2Z1bC1naXQtYnJhbmNoaW5nLW1vZGVsLw==&#34;&gt; Git flow&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;它最主要的特点有两个。首先，项目存在两个长期分支，分别是：主分支 master、开发分支 develop。其次，项目存在三种短期分支，分别是：功能分支（feature branch）、补丁分支（hotfix branch）、预发分支（release branch），一旦完成开发，它们就会被合并进 develop 或 master，然后被删除。&lt;/p&gt;
&lt;h3 id=&#34;1-git-flow流程图&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-git-flow流程图&#34;&gt;#&lt;/a&gt; (1). Git Flow 流程图&lt;/h3&gt;
&lt;p&gt;&lt;img data-src=&#34;https://statics.sh1a.qingstor.com/2018/09/24/imagegit-flow.png&#34; alt=&#34;Git Flow流程图&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-git-flow常用的分支&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-git-flow常用的分支&#34;&gt;#&lt;/a&gt; (2). Git Flow 常用的分支&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Production&lt;/code&gt;  分支。也就是我们经常使用的 Master 分支，这个分支最近发布到生产环境的代码，最近发布的 Release， 这个分支只能从其他分支合并，不能在这个分支直接修改。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Develop&lt;/code&gt;  分支。这个分支是我们是我们的主开发分支，包含所有要发布到下一个 Release 的代码，这个主要合并与其他分支，比如 Feature 分支。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Feature&lt;/code&gt;  分支。这个分支主要是用来开发一个新的功能，一旦开发完成，我们合并回 Develop 分支进入下一个 Release。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Release&lt;/code&gt;  分支。当你需要一个发布一个新 Release 的时候，我们基于 Develop 分支创建一个 Release 分支，完成 Release 后，我们合并到 Master 和 Develop 分支。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Hotfix&lt;/code&gt;  分支。当我们在 Production 发现新的 Bug 时候，我们需要创建一个 Hotfix, 完成 Hotfix 后，我们合并回 Master 和 Develop 分支，所以 Hotfix 的改动会进入下一个 Release。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-git-flow代码示例&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-git-flow代码示例&#34;&gt;#&lt;/a&gt; (3). Git Flow 代码示例&lt;/h3&gt;
&lt;h4 id=&#34;a-创建develop分支&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#a-创建develop分支&#34;&gt;#&lt;/a&gt; a. 创建 develop 分支&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt; origin develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;b-开始新feature开发&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#b-开始新feature开发&#34;&gt;#&lt;/a&gt; b. 开始新 Feature 开发&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout &lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt; some-feature develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Optionally, push branch to origin:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt; origin some-feature&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 做一些改动&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; status&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;add&lt;/span&gt; some-file&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; commit&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;c-完成feature&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#c-完成feature&#34;&gt;#&lt;/a&gt; c. 完成 Feature&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; pull origin develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge --no-ff some-feature&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; some-feature&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# If you pushed branch to origin:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin &lt;span class=&#34;token parameter variable&#34;&gt;--delete&lt;/span&gt; some-feature&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;d-开始relase&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#d-开始relase&#34;&gt;#&lt;/a&gt; d. 开始 Relase&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout &lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt; release-0.1.0 develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Optional: Bump version number, commit&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# Prepare release, commit&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;e-完成release&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#e-完成release&#34;&gt;#&lt;/a&gt; e. 完成 Release&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge --no-ff release-0.1.0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge --no-ff release-0.1.0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; release-0.1.0&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# If you pushed branch to origin:&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push origin &lt;span class=&#34;token parameter variable&#34;&gt;--delete&lt;/span&gt; release-0.1.0   &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; tag &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt; v0.1.0 master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;--tags&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;f-开始hotfix&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#f-开始hotfix&#34;&gt;#&lt;/a&gt; f. 开始 Hotfix&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout &lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt; hotfix-0.1.1 master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h4 id=&#34;g-完成hotfix&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#g-完成hotfix&#34;&gt;#&lt;/a&gt; g. 完成 Hotfix&lt;/h4&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge --no-ff hotfix-0.1.1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; checkout develop&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; merge --no-ff hotfix-0.1.1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; branch &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; hotfix-0.1.1&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; tag &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt; v0.1.1 master&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;git&lt;/span&gt; push &lt;span class=&#34;token parameter variable&#34;&gt;--tags&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/5924/</guid>
            <title>话术</title>
            <link>https://metal-heart.github.io/posts/5924/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="职场" scheme="https://metal-heart.github.io/categories/work/Workplace/" />
            <category term="沟通" scheme="https://metal-heart.github.io/tags/%E6%B2%9F%E9%80%9A/" />
            <category term="话术" scheme="https://metal-heart.github.io/tags/%E8%AF%9D%E6%9C%AF/" />
            <pubDate>Mon, 11 Jul 2022 09:12:29 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;话术&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#话术&#34;&gt;#&lt;/a&gt; 话术&lt;/h1&gt;
&lt;h2 id=&#34;职场黑话&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#职场黑话&#34;&gt;#&lt;/a&gt; 职场 “黑话”&lt;/h2&gt;
&lt;h3 id=&#34;二字动词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#二字动词&#34;&gt;#&lt;/a&gt; 二字动词&lt;/h3&gt;
&lt;p&gt;复盘，赋能，加持，沉淀，倒逼，落地，串联，协同，反哺，兼容，包装，重组，履约，响应，量化，布局，联动，细分，梳理，输出，加速，共建，支撑，融合，聚合，集成，对标，聚焦，抓手，拆解，抽象，摸索，提炼，打通，打透，吃透，迁移，分发，分装，辐射，围绕，复用，渗透，扩展，开拓，皮实，共创，共建，解耦，集成，对齐，拉齐，对焦，给到，拿到，死磕&lt;/p&gt;
&lt;h3 id=&#34;三字名词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#三字名词&#34;&gt;#&lt;/a&gt; 三字名词&lt;/h3&gt;
&lt;p&gt;感知度，方法论，组合拳，引爆点，点线面，精细化，差异化，平台化，结构化，影响力，耦合性，便捷性，一致性，端到端，短平快，护城河，体验感，&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly93d3cuemhpaHUuY29tL3NlYXJjaD9xPSVFOSVBMiU5NyVFNyVCMiU5MiVFNSVCQSVBNiZhbXA7c2VhcmNoX3NvdXJjZT1FbnRpdHkmYW1wO2h5YnJpZF9zZWFyY2hfc291cmNlPUVudGl0eSZhbXA7aHlicmlkX3NlYXJjaF9leHRyYT0lN0IlMjJzb3VyY2VUeXBlJTIyJTNBJTIyYW5zd2VyJTIyJTJDJTIyc291cmNlSWQlMjIlM0EyMjcyMDA1MjY3JTdE&#34;&gt;颗粒度&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&#34;四字名词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#四字名词&#34;&gt;#&lt;/a&gt; 四字名词&lt;/h3&gt;
&lt;p&gt;生命周期，价值转化，强化认知，资源倾斜，完善逻辑，抽离透传，复用打法，商业模式，快速响应，定性定量，关键路径，去中心化，结果导向，垂直领域，归因分析，体验度量，信息屏障，资源整合&lt;/p&gt;
&lt;h3 id=&#34;术语应用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#术语应用&#34;&gt;#&lt;/a&gt; 术语应用&lt;/h3&gt;
&lt;p&gt;比如原来你提问：这个问题你准备怎么解决？&lt;/p&gt;
&lt;p&gt;现在的你可以说：你这个问题的底层逻辑是什么？顶层设计在哪？最终交付价值是什么？过程的抓手在哪？如何保证回答闭环？你比别人的亮点在哪？优势在哪？你的思考和沉淀是什么？这个问题换成我来问是否会不一样？在这之前，有自己的思考和沉淀吗？这些问题的颗粒度是怎样拆分的，能作为爆点，引发回答者对问题关键路径的探索吗？别人回答了，你能反哺赋能他们，共建团队意识生态吗？只会问而不会解决，你有自己独有的价值吗？&lt;/p&gt;
&lt;p&gt;比如你之前只会一脸懵逼的看着他，愣着不敢说话，现在你可以这么回复他：&lt;/p&gt;
&lt;p&gt;我们这款产品底层逻辑是打通信息屏障，创建行业新生态。顶层设计是聚焦用户感知赛道，通过差异化和颗粒度达到引爆点。交付价值是在垂直领域采用复用打法达成持久收益。抽离透传归因分析作为抓手为产品赋能，体验度量作为闭环的评判标准。亮点是载体，优势是链路。思考整个生命周期，完善逻辑考虑资源倾斜。方法论是组合拳达到平台化标准。&lt;/p&gt;
&lt;h2 id=&#34;模板&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#模板&#34;&gt;#&lt;/a&gt; 模板&lt;/h2&gt;
&lt;h3 id=&#34;yes-and-法则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#yes-and-法则&#34;&gt;#&lt;/a&gt; yes and 法则&lt;/h3&gt;
&lt;p&gt;当别人提出一个观点，自己不认同时，我们往往会说，yes，but，这样别人会觉得 “那就这样吧，你说什么就是什么吧” 的想法，无法形成有效的沟通。&lt;/p&gt;
&lt;p&gt;yes-and 的原则首先是要接纳，而不是全身都是刺，即当别人提出观点的时候还没仔细思考就先给予否定，尤其当对方不认可攻击你时，很多人立马想到的就是反击。&lt;/p&gt;
&lt;p&gt;然后关键是这里的 and，这里的 and 并不是转折或反驳，而是并且或附加的内容，可以巧妙地避免意见不同甚至冲突，所以 yes-and 不仅仅是做事方式，也是一种特别好的沟通方式，让对方感受很舒服。&lt;/p&gt;
&lt;p&gt;【示例】&lt;/p&gt;
&lt;p&gt;男朋友特别喜欢爬山，有一天男朋友邀请女生去爬山，女生说了下面的一段话 &amp;quot;我不爱爬上，但是我特别好奇你到山顶后看到的风景，你能爬上去之后能给我拍几样张照片吗？专门为我拍的，然后你下来以后，我在哪个咖啡馆等你，你跟我讲讲此次的经历！&amp;quot;&lt;/p&gt;
&lt;p&gt;可以听出来，这位女生并不爱爬山，也没有勉强自己去迎合新的男朋友，而是肯定了男朋友的爱好，并且在此基础上创造了新的情景来继续他们的交流！&lt;/p&gt;
&lt;h3 id=&#34;prep-模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#prep-模型&#34;&gt;#&lt;/a&gt; PREP 模型&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;PREP 模型用于&lt;strong&gt;表达观点&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PREP 四个英文字母分别代表：Point，观点；Reason，理由；Example，案例；Point，再次讲观点。这是最经典的表达结构。&lt;/p&gt;
&lt;p&gt;整个 PREP 结构的关键是，开始就要讲出你的观点，点明主题；后面再举出理由来论证观点；案例部分，最好讲自己的经历或故事来解释，这样听众比较容易听懂；最后再重复和强调一下你的观点。&lt;/p&gt;
&lt;h3 id=&#34;scq-a-模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#scq-a-模型&#34;&gt;#&lt;/a&gt; SCQ-A 模型&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SCQ-A 模型 用于&lt;strong&gt;提出问题，请求帮助&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;situation&lt;/strong&gt;：阐述背景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;conflict&lt;/strong&gt;：阐述冲突&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;question&lt;/strong&gt;：为了解决冲突，你提出要解决的问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;answer&lt;/strong&gt;：你的看法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;【示例】&lt;/p&gt;
&lt;p&gt;老板，最近竞争对手上任了新的 CEO，做了一系列措施，比如下调了产品的价格，增大推广和营销，导致现在我们的很多市场被对方蚕食了。&lt;/p&gt;
&lt;p&gt;我们现在该如何调整应应对当前的情况，保持市场上的领导位置。&lt;/p&gt;
&lt;p&gt;目前我的看法就是优化目前的营销渠道，全面包围对手。&lt;/p&gt;
&lt;h3 id=&#34;ffc-赞美法则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ffc-赞美法则&#34;&gt;#&lt;/a&gt; FFC 赞美法则&lt;/h3&gt;
&lt;p&gt;所谓 FFC 赞美法，就是指在赞美人的时候，先用自己的语言来表达感受（Feel），然后再进一步通过陈述事实（Fact）来论证自己的感受，最后再通过比较（Compare），来加深对对方的认可，这样对方会感觉特别好。&lt;/p&gt;
&lt;h3 id=&#34;让对方服从你行为的经典话术&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#让对方服从你行为的经典话术&#34;&gt;#&lt;/a&gt; 让对方服从你行为的经典话术&lt;/h3&gt;
&lt;p&gt;这个话术一般来讲模板是这样的： 是.. 还是.../ 是否 / 要不要，xxx 好处是这样。&lt;/p&gt;
&lt;p&gt;这里的关键是尽量不让用户思考，提供非 A 即 B 的选项，说某个选项的好处，从而让对方服从你。&lt;/p&gt;
&lt;p&gt;比如麦当劳、肯德基有 3 个经典话术，进行快推式产品营销：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;您是否要加一包薯条，这样可以凑成一个套餐，节省 2 元？（实际上多消费 5 元）&lt;/li&gt;
&lt;li&gt;您要不要加 3 元把可乐换成大杯，可以多一半哦？&lt;/li&gt;
&lt;li&gt;您要不要加 10 元买个玩具给小朋友呢？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;沟通中的万能表达模型-观察感受需求请求&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#沟通中的万能表达模型-观察感受需求请求&#34;&gt;#&lt;/a&gt; 沟通中的万能表达模型 - 观察 + 感受 + 需求 + 请求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;观察：即你观察的客观事实是什么？注意这里要是事实才行&lt;/li&gt;
&lt;li&gt;感受：通过观察之后，你心情感受是怎样的？&lt;/li&gt;
&lt;li&gt;需求：你内心希望要解决的问题是什么？&lt;/li&gt;
&lt;li&gt;请求：向对方请求你的需求需要得到满足&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ffa-法则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ffa-法则&#34;&gt;#&lt;/a&gt; FFA 法则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fact—— 事实&lt;/li&gt;
&lt;li&gt;Feeling—— 感受&lt;/li&gt;
&lt;li&gt;Action—— 行动&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最近一段团队不少新人加入，整体运营效率下降了 30%。（事实）我感觉主要是业务知识传递有些跟不上。（感受）接下来的一周，我会安排老员工一对一辅导每位新人。（行动）&lt;/p&gt;
&lt;h2 id=&#34;实战&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#实战&#34;&gt;#&lt;/a&gt; 实战&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;别人求你办事，如果你说：“这事儿不太好办”，那么资源置换就来了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不好办说明能办，但需要附加条件，懂的人自然知道接下来应该怎么办。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;拒绝借钱：“你知道的，我最近 XX，也没钱。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;遇到借钱，只要你平时不太露富，就好用。&lt;/p&gt;
&lt;p&gt;朋友管你借钱，用 “你知道的” 直接把皮球踢回去，再给个具体理由，比如买了什么东西、投入基金股票里了，随便什么都行。&lt;/p&gt;
&lt;p&gt;只要把对方放在知道你没钱的位置上，他就不好再开下一句口，一般会主动结束对话。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表示体贴，但不想真的去接客户，先打电话沟通：“约的地方有点远，需要我去接您吗？”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;绝大部分人遇到这样的问句，本能反应是不用，你的目的就达到了。&lt;/p&gt;
&lt;p&gt;不过如果真遇到要你接的，这人多半有点矫情，以后相处要注意多恭维一下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典汇报话术 1：“老板，我们团队做了 A、B 两版方案，各有优势，您给提提意见，看选哪个好。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;该话术利用了沉锚效应，抛出了二者选其一的锚，避开全部拒绝的选项，引导领导 “选一个”、“提意见”，减小被全部驳回的风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典汇报话术 2：“领导，我是这么想的，XXX。第一，X；第二，X；第三，X。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们的大脑被训练得听到 “第一、第二” 就默认为其中有条理、有逻辑，不管其中是不是真的严丝合缝地支撑你的观点。善用一二三做汇报，领导会觉得你准备得很充分，考虑周全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;遇到问题请求领导帮忙：“经过了解，现在碰到了一些情况，我的解决办法是 XX，您看还有没有什么更好的办法。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要直接说自己解决不了，让领导想办法。不管自己提出的办法多平庸，都一定要提。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请求他人帮忙：“能请你帮我打印一下文件吗，因为我一会儿真有事。”、“不好意思，能插一下队吗，因为我真的着急。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;善用 “因为所以”，“因为所以” 是十几年语文教学留给我们的条件反射，不管多离奇的理由，听到的时候都会默认有道理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;聊天想聊下去：揪住对方句子里的关键词 + 延伸过往彼此交流过的信息。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;朋友：“今天又加班，烦死了。”&lt;/p&gt;
&lt;p&gt;你：“怎么又加班啊，又是上回让你加班的那个领导吗？”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;闺蜜：“我爱豆塌房子了！”&lt;/p&gt;
&lt;p&gt;你：“哪个爱豆？上回你说的 XXX？我去！”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;聊天不想继续聊下去：重复关键词 +&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly93d3cuemhpaHUuY29tL3NlYXJjaD9xPSVFNiU4NCU5RiVFNSU4RiVCOSVFOCVBRiU4RCZhbXA7c2VhcmNoX3NvdXJjZT1FbnRpdHkmYW1wO2h5YnJpZF9zZWFyY2hfc291cmNlPUVudGl0eSZhbXA7aHlicmlkX3NlYXJjaF9leHRyYT0lN0IlMjJzb3VyY2VUeXBlJTIyJTNBJTIyYW5zd2VyJTIyJTJDJTIyc291cmNlSWQlMjIlM0ExNzkxNTU2MzQzJTdE&#34;&gt; 感叹词&lt;/span&gt;。重点！不要扩展任何有效信息。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;朋友：“今天又加班，烦死了”&lt;/p&gt;
&lt;p&gt;你：“怎么又加班啊，唉，这叫啥事啊，我无语。”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;闺蜜：“我爱豆又塌房子了！”&lt;/p&gt;
&lt;p&gt;你：“又塌房子！我去，也太那个了，绝了！”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;领导说：“辛苦了。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你：“从中学到很多，很有收获。”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;敏而好学、不居功，领导更喜欢这样的下属。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给领导的节日问候：尊称 + 感谢 + 互动 + 祝福&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;尊称放在前面，引起注意。互动要具体、细节，才有记忆点。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;XX，过年好！&lt;br /&gt;
感谢您一直的关照，从您身上学到很多。&lt;/p&gt;
&lt;p&gt;上次 XX，您说 XXX 我一直记得，受益匪浅。&lt;/p&gt;
&lt;p&gt;又到新的一年，祝您和家人新年快乐！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;改变一个人的想法：认同立场，替换观点。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;无论任何人，观点不是不可改变的，但立场很难动摇。&lt;/p&gt;
&lt;p&gt;比如你的预算交上去，被砍了很大一块，你能做的不是抱怨老板抠门，而是认同老板砍预算是为了控制成本，&lt;strong&gt;开公司是为了赚钱的，这就是老板该有的立场。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，如果你不想自己的预算被砍掉，只有你能向老板展示，你做的方案能为他赚更多钱，老板就不会不同意。&lt;/p&gt;
&lt;h3 id=&#34;工作汇报&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#工作汇报&#34;&gt;#&lt;/a&gt; 工作汇报&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;实情&lt;/th&gt;
&lt;th&gt;话术&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;新项目玩砸了&lt;/td&gt;
&lt;td&gt;进行了积极的试错，吸收了宝贵的经验。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据不好看&lt;/td&gt;
&lt;td&gt;有较大的增长空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;啥也没干&lt;/td&gt;
&lt;td&gt;稳定发展&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;接下来，我依旧打算啥也不干&lt;/td&gt;
&lt;td&gt;保持现有成绩，稳定成果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据稍微好看一点&lt;/td&gt;
&lt;td&gt;取得了较大增长&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;沟通&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#沟通&#34;&gt;#&lt;/a&gt; 沟通&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;当你觉得对方特别啰嗦，又不好意思打断对方谈话&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接给对方说的话下定义，作评判。例如：“好的”、“那确实不错”、“的确是这样”、“嗯，你说的对” 等等。&lt;/p&gt;
&lt;p&gt;对方会瞬间失去表达欲望。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;当你接到你不想做的任务时&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我仔细看了一下这个需求，我这里可能存在 XXX XXX XXX 方面的短板&lt;/li&gt;
&lt;li&gt;“领导，我仔细看了一下这个需求，我这里可能存在 XXX XXX XXX 方面的短板”&lt;/li&gt;
&lt;li&gt;“想要推进这件事情的话，我可能需要 XXX XXX XXX 方面的支持”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好的可能：领导感觉你是认真经过调研，分析了可行性，确实你不太适合，他表示会再考虑考虑&lt;/p&gt;
&lt;p&gt;坏的可能：你还是得做，但是这句话的意思已经很明确了：我可是给你说清楚了啊，这件事办砸了，你可不能赖我&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;当我想刺探什么秘密的时候，我会先说一个结论，然后看对方的反应&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“我们公司下个月要发奖金你知道对吧，想好怎么花了么？”
&lt;ul&gt;
&lt;li&gt;“卧槽你这消息灵通啊”—— 真的要发&lt;/li&gt;
&lt;li&gt;“你听谁说的”—— 不知道真假，但是可以继续测&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这个时候我会再补一句：“我能得到这个消息，说明肯定有人放风给我”
&lt;ul&gt;
&lt;li&gt;“胡扯，没有这个规划”—— 下个月不发奖金&lt;/li&gt;
&lt;li&gt;“你每天花花肠子怎么这么多”—— 没有明确的回应这个问题，我的猜测 80% 是真实的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;临时要交什么汇报，或者做工作总结的时候，不要紧张&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;【你日常都在做什么】+【这件事的目的是什么】+【你在做这件事的时候有什么困难】+【怎么把这件事做的更好】&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;p&gt;我最近在更新我的知乎账号，坚持回答问题，这是为了能够积累更多的粉丝数，获得更多的认同，也培养自己输出的习惯&lt;/p&gt;
&lt;p&gt;但是我发现我的阅读量上去了，但是点赞量还没有起来&lt;/p&gt;
&lt;p&gt;所以我决定在写到这一段的时候给读者老爷们磕个头求个赞，哐哐哐&lt;/p&gt;
&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;p&gt;先肯定对方的想法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尽量不要出现比较主观的用语，如：“我觉得”、“照我看”、“我认为”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;【示例】我仔细听了你的诉求，很有道理，这个需求是可以理解的。但是，我们换个角度想一想：......。而且，我还听别人说：.....。所以，不妨折中一下：.....。你觉得这样如何呢？&lt;/p&gt;
&lt;p&gt;当别人给你布置杂活的时候&lt;/p&gt;
&lt;p&gt;我们要死扣细节，不停问细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;“你说的这件事大概什么时候需要？”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“这个时间点具体到几点？”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“我是微信给你还是邮箱给你？”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“那需要我先给一个计划，你帮我看看合适不合适么？”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;......&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个杂活而已，你不停地追问细节，会极大地增加你们之间的沟通成本，让对方崩溃，从此再也不想给你安排杂活。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#参考资料&#34;&gt;#&lt;/a&gt; 参考资料&lt;/h2&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/a1a87ec3/</guid>
            <title>复杂度分析</title>
            <link>https://metal-heart.github.io/posts/a1a87ec3/</link>
            <category term="软件" scheme="https://metal-heart.github.io/categories/Software/" />
            <category term="数据结构和算法" scheme="https://metal-heart.github.io/categories/Software/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95/" />
            <category term="综合" scheme="https://metal-heart.github.io/categories/Software/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95/%E7%BB%BC%E5%90%88/" />
            <category term="数据结构" scheme="https://metal-heart.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" />
            <category term="算法" scheme="https://metal-heart.github.io/tags/%E7%AE%97%E6%B3%95/" />
            <pubDate>Sun, 20 Mar 2022 23:25:17 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;复杂度分析&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#复杂度分析&#34;&gt;#&lt;/a&gt; 复杂度分析&lt;/h1&gt;
&lt;h2 id=&#34;为什么需要复杂度分析&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#为什么需要复杂度分析&#34;&gt;#&lt;/a&gt; 为什么需要复杂度分析&lt;/h2&gt;
&lt;p&gt;衡量算法的优劣，有两种评估方式：事前估计和后期测试。&lt;/p&gt;
&lt;p&gt;后期测试有性能测试、基准测试（Benchmark）等手段。&lt;/p&gt;
&lt;p&gt;但是，后期测试有以下限制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测试结果非常依赖测试环境&lt;/strong&gt;。如：不同机型、不同编译器版本、不同硬件配置等等，都会影响测试结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试结果受数据规模的影响很大&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，需要一种方法，可以不受环境或数据规模的影响，粗略地估计算法的执行效率。这种方法就是复杂度分析。&lt;/p&gt;
&lt;h2 id=&#34;时间复杂度分析&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#时间复杂度分析&#34;&gt;#&lt;/a&gt; 时间复杂度分析&lt;/h2&gt;
&lt;h3 id=&#34;大-o-表示法&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大-o-表示法&#34;&gt;#&lt;/a&gt; 大 O 表示法&lt;/h3&gt;
&lt;p&gt;假设问题的规模为 n，则程序的时间复杂度表示为  &lt;code&gt;T(n)&lt;/code&gt; 。&lt;strong&gt;代码的执行时间 T (n) 与每行代码的执行次数 n 成正比&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当 n 增大时，T (n) 也随之增大，想要准确估计其变化比较困难。所以，可以采用大 O 时间复杂度来粗略估计其复杂度，其表达式为：&lt;strong&gt; &lt;code&gt;T(n) = O(f(n))&lt;/code&gt; &lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大 O 表示法&lt;/strong&gt;实际上并不具体表示代码真正的执行时间，而是表示&lt;strong&gt;代码执行时间随数据规模增长的变化趋势&lt;/strong&gt;，所以，也叫作&lt;strong&gt;渐进时间复杂度&lt;/strong&gt;（asymptotic time complexity），简称&lt;strong&gt;时间复杂度&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;时间复杂度分析的要点&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#时间复杂度分析的要点&#34;&gt;#&lt;/a&gt; 时间复杂度分析的要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只关注循环执行次数最多的一段代码&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加法法则：总复杂度等于量级最大的那段代码的复杂度&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;乘法法则：嵌套代码的复杂度等于嵌套内外代码复杂度的乘积&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;最好-最坏和平均情况&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#最好-最坏和平均情况&#34;&gt;#&lt;/a&gt; 最好、最坏和平均情况&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最好情况时间复杂度&lt;/strong&gt;（best case time complexity）：&lt;strong&gt;在最理想的情况下，执行代码的时间复杂度&lt;/strong&gt;。例如：在最理想的情况下，要查找的变量 x 正好是数组的第一个元素，此时最好情况时间复杂度为 1。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最坏情况时间复杂度&lt;/strong&gt;（worst case time complexity）：&lt;strong&gt;在最糟糕的情况下，执行代码的时间复杂度&lt;/strong&gt;。例如：在最理想的情况下，要查找的变量 x 正好是数组的最后个元素，此时最好情况时间复杂度为 n。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均情况时间复杂度&lt;/strong&gt;（average case time complexity）：平均时间复杂度的全称应该叫&lt;strong&gt;加权平均时间复杂度&lt;/strong&gt;或者&lt;strong&gt;期望时间复杂度&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;时间复杂度分析示例&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#时间复杂度分析示例&#34;&gt;#&lt;/a&gt; 时间复杂度分析示例&lt;/h3&gt;
&lt;p&gt;【示例】从 1 累加到 100 的时间复杂度是多少？&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; sum &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;N&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;N&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    sum &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; sum &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; i&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;时间复杂度计算：显然，这段代码执行了 100 次加法，其时间复杂度和 N 的大小完全一致&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;T(n) = O(n)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;【示例】嵌套循环的时间复杂度是多少？&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;M&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;N&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; j &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; j &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;N&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; j&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token class-name&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;out&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;i = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;, j = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; j&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;时间复杂度计算：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;T(n) = (M-1)(N-1) = O(M*N) ≈ O(N^2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;【示例】递归函数的时间复杂度是多少？思考一下斐波那契数列  &lt;code&gt;f(n) = f(n-1) + f(n-2)&lt;/code&gt;  的时间复杂度是多少？&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220320110642.png&#34; alt=&#34;img&#34; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;T(n) = O(2^N)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;空间复杂度分析&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#空间复杂度分析&#34;&gt;#&lt;/a&gt; 空间复杂度分析&lt;/h2&gt;
&lt;p&gt;时间复杂度的全称是&lt;strong&gt;渐进时间复杂度&lt;/strong&gt;，&lt;strong&gt;表示算法的执行时间与数据规模之间的增长关系&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;类比一下，空间复杂度全称就是&lt;strong&gt;渐进空间复杂度&lt;/strong&gt;（asymptotic space complexity），&lt;strong&gt;表示算法的存储空间与数据规模之间的增长关系&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;复杂度量级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#复杂度量级&#34;&gt;#&lt;/a&gt; 复杂度量级&lt;/h2&gt;
&lt;p&gt;复杂度有以下量级：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(1)&lt;/code&gt; &lt;/strong&gt;：常数复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(log n)&lt;/code&gt; &lt;/strong&gt;：对数复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(n)&lt;/code&gt; &lt;/strong&gt;：线性复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(nlog n)&lt;/code&gt; &lt;/strong&gt;：线性对数阶复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(n^2)&lt;/code&gt; &lt;/strong&gt;：平方复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(n^3)&lt;/code&gt; &lt;/strong&gt;：立方复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(n^k)&lt;/code&gt; &lt;/strong&gt;：K 次方复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(2^n)&lt;/code&gt; &lt;/strong&gt;：指数复杂度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt; &lt;code&gt;O(n!)&lt;/code&gt; &lt;/strong&gt;：阶乘复杂度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在数据量比较小的时候，复杂度量级差异并不明显；但是，随着数据规模大小的变化，差异会逐渐突出。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220320160627.png&#34; alt=&#34;img&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;O(1)&lt;/code&gt;  复杂度示例：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; num &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token class-name&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;out&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;num = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; num&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;O(log n)&lt;/code&gt;  对数复杂度示例：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; max &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; max&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token class-name&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;out&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;i = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;O(n)&lt;/code&gt;  复杂度示例：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; max &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; max&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token class-name&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;out&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;i = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;O(n^2)&lt;/code&gt;  复杂度示例：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;M&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;N&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; j &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; j &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;N&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; j&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;        &lt;span class=&#34;token class-name&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;out&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;i = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;, j = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; j&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;O(k^n)&lt;/code&gt;  复杂度示例：&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; max &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;int&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Math&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pow&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; max&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;    &lt;span class=&#34;token class-name&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;out&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;i = &#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;常见数据结构的复杂度&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#常见数据结构的复杂度&#34;&gt;#&lt;/a&gt; 常见数据结构的复杂度&lt;/h2&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20200702071922.png&#34; alt=&#34;img&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#参考资料&#34;&gt;#&lt;/a&gt; 参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly90aW1lLmdlZWtiYW5nLm9yZy9jb2x1bW4vaW50cm8vMTAwMDE3MzAx&#34;&gt;数据结构与算法之美&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/37138/</guid>
            <title>代码工程规范</title>
            <link>https://metal-heart.github.io/posts/37138/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="工作效率" scheme="https://metal-heart.github.io/categories/work/efficiency/" />
            <category term="效率提升" scheme="https://metal-heart.github.io/tags/%E6%95%88%E7%8E%87%E6%8F%90%E5%8D%87/" />
            <category term="规范" scheme="https://metal-heart.github.io/tags/%E8%A7%84%E8%8C%83/" />
            <pubDate>Sat, 18 Dec 2021 19:26:20 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;代码工程规范&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#代码工程规范&#34;&gt;#&lt;/a&gt; 代码工程规范&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;软件项目开发规范。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;项目结构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#项目结构&#34;&gt;#&lt;/a&gt; 项目结构&lt;/h2&gt;
&lt;p&gt;以下为项目根目录下的文件和目录的组织结构：&lt;/p&gt;
&lt;h3 id=&#34;目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#目录&#34;&gt;#&lt;/a&gt; 目录&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;codes&lt;/strong&gt; - 代码目录。&lt;br /&gt;
&lt;strong&gt;configurations&lt;/strong&gt; - 配置目录。一般存放项目相关的配置文件。如 maven 的 settings.xml，nginx 的 nginx.conf 等。&lt;br /&gt;
&lt;strong&gt;demos&lt;/strong&gt; - 示例目录。&lt;br /&gt;
&lt;strong&gt;docs&lt;/strong&gt; - 文档目录。&lt;br /&gt;
&lt;strong&gt;libs&lt;/strong&gt; - 第三方库文件。&lt;br /&gt;
&lt;strong&gt;scripts&lt;/strong&gt; - 脚本目录。一般存放用于启动、构建项目的可执行脚本文件。&lt;br /&gt;
&lt;strong&gt;packages&lt;/strong&gt; - 打包文件目录。Java 项目中可能是 jar、war 等；前端项目中可能是 zip、rar 等；电子书项目中可能是 pdf 等。&lt;/p&gt;
&lt;h3 id=&#34;文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#文件&#34;&gt;#&lt;/a&gt; 文件&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;.gitignore&lt;/strong&gt; - git 忽略规则。&lt;br /&gt;
&lt;strong&gt;.gitattributes&lt;/strong&gt; - git 属性规则。&lt;br /&gt;
&lt;strong&gt;.editorconfig&lt;/strong&gt; - 编辑器书写规则。&lt;br /&gt;
&lt;strong&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL1JFQURNRS5tZA==&#34;&gt;README.md&lt;/span&gt;&lt;/strong&gt; - 项目说明文件。&lt;br /&gt;
&lt;strong&gt;LICENSE&lt;/strong&gt; - 开源协议。如果项目是开源文件，需要添加。&lt;/p&gt;
&lt;h2 id=&#34;命名规则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#命名规则&#34;&gt;#&lt;/a&gt; 命名规则&lt;/h2&gt;
&lt;h3 id=&#34;目录名&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#目录名&#34;&gt;#&lt;/a&gt; 目录名&lt;/h3&gt;
&lt;p&gt;目录名必须使用半角字符，不得使用全角字符。这也意味着，中文不能用于文件名。&lt;/p&gt;
&lt;p&gt;目录名建议只使用小写字母，不使用大写字母。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不佳： Test
正确： test
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目录名可以使用数字，但不应该是首字符。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不佳： 1-demo
正确： demo1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目录名包含多个单词时，单词之间建议使用半角的连词线（ &lt;code&gt;-&lt;/code&gt; ）分隔。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不佳： common_demo
正确： common-demo
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;文件名&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#文件名&#34;&gt;#&lt;/a&gt; 文件名&lt;/h3&gt;
&lt;p&gt;文档的文件名不得含有空格。&lt;/p&gt;
&lt;p&gt;文件名必须使用半角字符，不得使用全角字符。这也意味着，中文不能用于文件名。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;错误： 名词解释.md
正确： glossary.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件名建议只使用小写字母，不使用大写字母。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;错误：TroubleShooting.md
正确：troubleshooting.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了醒目，某些说明文件的文件名，可以使用大写字母，比如 &lt;code&gt;README&lt;/code&gt; 、 &lt;code&gt;LICENSE&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;一些约定俗成的习惯可以保持传统写法，如：Java 的文件名一般使用驼峰命名法，且首字母大写；配置文件  &lt;code&gt;applicationContext.xml&lt;/code&gt;  ；React 中的 JSX 组件文件名一般使用驼峰命名法，且首字母大写等。&lt;/p&gt;
&lt;p&gt;文件名包含多个单词时，单词之间建议使用半角的连词线（ &lt;code&gt;-&lt;/code&gt; ）分隔。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不佳：advanced_usage.md
正确：advanced-usage.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;java-日志规范&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#java-日志规范&#34;&gt;#&lt;/a&gt; Java 日志规范&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这里基于&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly95cS5hbGl5dW4uY29tL2F0dGFjaG1lbnQvZG93bmxvYWQvP2lkPTQ5NDI=&#34;&gt;阿里巴巴 Java 开发手册&lt;/span&gt;日志规约章节，结合自己的开发经验做了一些增删和调整。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;【强制】应用中不可直接使用日志系统（Log4j、Logback）中的 API，而应依赖使用日志框架 SLF4J 中的 API，使用门面模式的日志框架，有利于维护和各个类的日志处理方式统一。&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;figcaption data-lang=&#34;java&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token import&#34;&gt;&lt;span class=&#34;token namespace&#34;&gt;org&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;slf4j&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token class-name&#34;&gt;Logger&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token import&#34;&gt;&lt;span class=&#34;token namespace&#34;&gt;org&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;slf4j&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token class-name&#34;&gt;LoggerFactory&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token keyword&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;final&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Logger&lt;/span&gt; logger &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;LoggerFactory&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token class-name&#34;&gt;Abc&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;【强制】日志文件推荐至少保存  &lt;code&gt;30&lt;/code&gt;  天，因为有些异常具备以 “周” 为频次发生的特点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;【强制】应用中的扩展日志（如打点、临时监控、访问日志等）命名方式： &lt;code&gt;appName_logType_logName.log&lt;/code&gt; 。logType: 日志类型，推荐分类有 stats/desc/monitor/visit 等；logName: 日志描述。这种命名的好处：通过文件名就可知道日志文件属于什么应用，什么类型，什么目的，也有利于归类查找。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;正例&lt;/strong&gt;：mppserver 应用中单独监控时区转换异常，如： &lt;code&gt;mppserver_monitor_timeZoneConvert.log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt;：推荐对日志进行分类，如将错误日志和业务日志分开存放，便于开发人员查看，也便于通过日志对系统进行及时监控。&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;【强制】对  &lt;code&gt;trace/debug/info&lt;/code&gt;  级别的日志输出，必须使用条件输出形式或者使用占位符的方式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;说明： &lt;code&gt;logger.debug(&amp;quot;Processing trade with id: &amp;quot; + id + &amp;quot; and symbol: &amp;quot; + symbol);&lt;/code&gt;  如果日志级别是 warn，上述日志不会打印，但是会执行字符串拼接操作，如果 symbol 是对象，会执行 toString () 方法，浪费了系统资源，执行了上述操作，最终日志却没有打印。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正例：（条件）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (logger.isDebugEnabled()) &amp;#123;
logger.debug(&amp;quot;Processing trade with id: &amp;quot; + id + &amp;quot; and symbol: &amp;quot; + symbol);
&amp;#125;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;正例：（占位符）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;logger.debug(&amp;quot;Processing trade with id: &amp;#123;&amp;#125; and symbol : &amp;#123;&amp;#125; &amp;quot;, id, symbol);
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;【强制】避免重复打印日志，浪费磁盘空间。务必在  &lt;code&gt;log4j.xml&lt;/code&gt;  或  &lt;code&gt;logback.xml&lt;/code&gt;  中设置  &lt;code&gt;additivity=false&lt;/code&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;正例&lt;/strong&gt;：&lt;/p&gt;
&lt;figure class=&#34;highlight xml&#34;&gt;&lt;figcaption data-lang=&#34;XML&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;logger&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;com.taobao.dubbo.config&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;additivity&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;false&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;【强制】异常信息应该包括两类信息：案发现场信息和异常堆栈信息。如果不处理，那么通过关键字 throws 往上抛出。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;正例&lt;/strong&gt;：logger.error (各类参数或者对象 toString + &amp;quot;_&amp;quot; + e.getMessage (), e);&lt;/p&gt;
&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;【强制】日志格式遵循如下格式：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2R1bnd1L2ltYWdlcy9kZXYvY3MvamF2YS9qYXZhbGliL2xvZy9sb2diYWNrL2xvZy1wYXR0ZXJuLnBuZw==&#34;&gt;https://raw.githubusercontent.com/dunwu/images/dev/cs/java/javalib/log/logback/log-pattern.png&lt;/span&gt;&amp;quot;/&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;打印出的日志信息如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2018-03-29 15:06:57.277 [javalib] [main] [TRACE] i.g.dunwu.javalib.log.LogbackDemo#main - 这是一条 trace 日志记录
2018-03-29 15:06:57.282 [javalib] [main] [DEBUG] i.g.dunwu.javalib.log.LogbackDemo#main - 这是一条 debug 日志记录
2018-03-29 15:06:57.282 [javalib] [main] [INFO] i.g.dunwu.javalib.log.LogbackDemo#main - 这是一条 info 日志记录
2018-03-29 15:06:57.282 [javalib] [main] [WARN] i.g.dunwu.javalib.log.LogbackDemo#main - 这是一条 warn 日志记录
2018-03-29 15:06:57.282 [javalib] [main] [ERROR] i.g.dunwu.javalib.log.LogbackDemo#main - 这是一条 error 日志记录
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;【参考】slf4j 支持的日志级别，按照级别从低到高，分别为： &lt;code&gt;trace &amp;lt; debug &amp;lt; info &amp;lt; warn &amp;lt; error&lt;/code&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;建议只使用  &lt;code&gt;debug &amp;lt; info &amp;lt; warn &amp;lt; error&lt;/code&gt;  四个级别。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;error&lt;/code&gt;  日志级别只记录系统逻辑出错、异常等重要的错误信息。如非必要，请不要在此场景打出 error 级别。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;warn&lt;/code&gt;  日志级别记录用户输入参数错误的情况，避免用户投诉时，无所适从。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;info&lt;/code&gt;  日志级别记录业务逻辑中一些重要步骤信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debug&lt;/code&gt;  日志级别记录一些用于调试的信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;【参考】有一些第三方框架或库的日志对于排查问题具有一定的帮助，如 Spring、Dubbo、Mybatis 等。这些框架所使用的日志库未必和本项目一样，为了避免出现日志无法输出的问题，请引入对应的桥接 jar 包。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#参考资料&#34;&gt;#&lt;/a&gt; 参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly95cS5hbGl5dW4uY29tL2F0dGFjaG1lbnQvZG93bmxvYWQvP2lkPTQ5NDI=&#34;&gt;阿里巴巴 Java 开发手册&lt;/span&gt;日志规约章节&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/35174/</guid>
            <title>个人目录管理规范</title>
            <link>https://metal-heart.github.io/posts/35174/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="工作效率" scheme="https://metal-heart.github.io/categories/work/efficiency/" />
            <category term="效率提升" scheme="https://metal-heart.github.io/tags/%E6%95%88%E7%8E%87%E6%8F%90%E5%8D%87/" />
            <category term="规范" scheme="https://metal-heart.github.io/tags/%E8%A7%84%E8%8C%83/" />
            <pubDate>Sat, 11 Dec 2021 10:23:22 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;个人目录管理规范&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#个人目录管理规范&#34;&gt;#&lt;/a&gt; 个人目录管理规范&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作为程序员，想必每个人都会有大量的资料、数据。按照条理清晰的目录结构去分类化存储，十分有助于管理文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;目录结构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#目录结构&#34;&gt;#&lt;/a&gt; 目录结构&lt;/h2&gt;
&lt;p&gt;以下是我个人整理的目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.
├── Codes           #代码目录
│   ├── Other       #第三方代码目录
│   ├── My          #个人代码目录
│   └── Work        #工作代码目录
├── Data            #数据目录
├── Downloads       #下载文件目录
├── Docs            #文档目录
│   ├── Books       #电子书目录
│   ├── My          #个人文档目录
│   └── Work        #工作文档目录
├── Movies          #视频目录
├── Music           #音乐目录
├── Pictures        #图片目录
├── Public          #共享目录
├── Temp            #临时文件目录
└── Tools           #工具软件目录
    └── Packages    #安装包目录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注：如果您使用的操作系统是 Mac 这种可以为目录或文件添加 tag 的操作系统，那么您可以根据自己的喜好更细致化的管理。&lt;/p&gt;
&lt;h2 id=&#34;2-文件管理软件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-文件管理软件&#34;&gt;#&lt;/a&gt; 2. 文件管理软件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;选用便利的文件管理软件，可以让你的文件管理如虎添翼。这里推荐几款经典的文件管理工具。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;21-clover&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#21-clover&#34;&gt;#&lt;/a&gt; 2.1. Clover&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL2NuLmVqaWUubWUv&#34;&gt;Clover&lt;/span&gt; 是 Windows Explorer 资源管理器的一个扩展，为其增加类似谷歌 Chrome 浏览器的多标签页功能。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL2NuLmVqaWUubWUvaW1hZ2VzL2Nsb3Zlci5qcGc=&#34;&gt;http://cn.ejie.me/images/clover.jpg&lt;/span&gt;&amp;quot; width=&amp;quot;640&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3 id=&#34;22-everything&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#22-everything&#34;&gt;#&lt;/a&gt; 2.2. Everything&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy52b2lkdG9vbHMuY29tLw==&#34;&gt;Everything&lt;/span&gt; 可以立即在 windows 系统中找到制定名称的文件和文件夹。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy52b2lkdG9vbHMuY29tL3Nzc21hbGwyLmdpZg==&#34;&gt;http://www.voidtools.com/sssmall2.gif&lt;/span&gt;&amp;quot; width=&amp;quot;640&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3 id=&#34;23-wox&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#23-wox&#34;&gt;#&lt;/a&gt; 2.3. Wox&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL1dveC1sYXVuY2hlci9Xb3g=&#34;&gt;Wox&lt;/span&gt; 是一款简单易用的 Windows 启动器。可以把它视为 windows 版的 Alfred。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9jYW1vLmdpdGh1YnVzZXJjb250ZW50LmNvbS85ZGIzMzU0NmQzYTkwNWE5YWQ5MTVlMDk0OGQzYmEzZjQ3ZjU3YjY0LzY4NzQ3NDcwM2EyZjJmNjkyZTY5NmQ2Nzc1NzIyZTYzNmY2ZDJmNDQ3NDc4NGU0MjRhNjkyZTY3Njk2Ng==&#34;&gt;https://camo.githubusercontent.com/9db33546d3a905a9ad915e0948d3ba3f47f57b64/687474703a2f2f692e696d6775722e636f6d2f4474784e424a692e676966&lt;/span&gt;&amp;quot; width=&amp;quot;640&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h3 id=&#34;24-q-dir&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#24-q-dir&#34;&gt;#&lt;/a&gt; 2.4. Q-dir&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy5zb2Z0cGVkaWEuY29tL2dldC9GaWxlLW1hbmFnZXJzL1EtRGlyLnNodG1s&#34;&gt;Q-dir&lt;/span&gt; 是轻量的文件管理器，特点鲜明，各种布局视图切换灵活，默认四个小窗口组成一个大窗口，操作快捷。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL2kxLXdpbi5zb2Z0cGVkaWEtc3RhdGljLmNvbS9zY3JlZW5zaG90cy9xLWRpcl8xLnBuZw==&#34;&gt;http://i1-win.softpedia-static.com/screenshots/q-dir_1.png&lt;/span&gt;&amp;quot; width=&amp;quot;640&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/11605/</guid>
            <title>技术文档规范</title>
            <link>https://metal-heart.github.io/posts/11605/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="工作效率" scheme="https://metal-heart.github.io/categories/work/efficiency/" />
            <category term="效率提升" scheme="https://metal-heart.github.io/tags/%E6%95%88%E7%8E%87%E6%8F%90%E5%8D%87/" />
            <category term="规范" scheme="https://metal-heart.github.io/tags/%E8%A7%84%E8%8C%83/" />
            <pubDate>Sat, 11 Dec 2021 10:23:22 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;技术文档规范&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#技术文档规范&#34;&gt;#&lt;/a&gt; 技术文档规范&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;文档采用 Markdown 语法书写。&lt;/p&gt;
&lt;p&gt;📚 「参考」Markdown 语法可以参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL2d1b2Rvbmd4aWFyZW4vUkVBRE1F&#34;&gt;https://github.com/guodongxiaren/README&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL3RjaGFwaS9tYXJrZG93bi1jaGVhdHNoZWV0&#34;&gt;https://github.com/tchapi/markdown-cheatsheet&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1-标题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-标题&#34;&gt;#&lt;/a&gt; 1. 标题&lt;/h2&gt;
&lt;h3 id=&#34;11-标题层级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#11-标题层级&#34;&gt;#&lt;/a&gt; 1.1. 标题层级&lt;/h3&gt;
&lt;p&gt;标题分为四级。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一级标题：文章的标题&lt;/li&gt;
&lt;li&gt;二级标题：文章内容的大标题&lt;/li&gt;
&lt;li&gt;三级标题：二级标题下一级的标题&lt;/li&gt;
&lt;li&gt;四级标题：三级标题下一级的标题&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;12-标题原则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#12-标题原则&#34;&gt;#&lt;/a&gt; 1.2. 标题原则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一篇文章中应该尽力避免同名标题。&lt;/li&gt;
&lt;li&gt;一级标题下，不能直接出现三级标题。&lt;/li&gt;
&lt;li&gt;标题要避免孤立编号（即同级标题只有一个）。&lt;/li&gt;
&lt;li&gt;下级标题不重复上一级标题的内容。&lt;/li&gt;
&lt;li&gt;谨慎使用四级标题，尽量避免出现，保持层级的简单和防止出现过于复杂的章节。如果三级标题下有并列性的内容，建议只使用项目列表（Item list）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-文本&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-文本&#34;&gt;#&lt;/a&gt; 2. 文本&lt;/h2&gt;
&lt;h3 id=&#34;21-字间距&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#21-字间距&#34;&gt;#&lt;/a&gt; 2.1. 字间距&lt;/h3&gt;
&lt;p&gt;全角中文字符与半角英文字符之间，应有一个半角空格。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：本文介绍如何快速启动Windows系统。

正例：本文介绍如何快速启动 Windows 系统。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;全角中文字符与半角阿拉伯数字之间，有没有半角空格都可，但必须保证风格统一，不能两种风格混杂。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;正例：2011年5月15日，我订购了5台笔记本电脑与10台平板电脑。

正例：2011 年 5 月 15 日，我订购了 5 台笔记本电脑与 10 台平板电脑。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;半角的百分号，视同阿拉伯数字。&lt;/p&gt;
&lt;p&gt;英文单位若不翻译，单位前的阿拉伯数字与单位间不留空格。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：一部容量为 16 GB 的智能手机

正例：一部容量为 16GB 的智能手机
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;半角英文字符和半角阿拉伯数字，与全角标点符号之间不留空格。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：他的电脑是 MacBook Air 。

正例：他的电脑是 MacBook Air。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;22-句子&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#22-句子&#34;&gt;#&lt;/a&gt; 2.2. 句子&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;避免使用长句。一个句子建议不超过 100 字或者正文的 3 行。&lt;/li&gt;
&lt;li&gt;尽量使用简单句和并列句，避免使用复合句。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23-写作风格&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#23-写作风格&#34;&gt;#&lt;/a&gt; 2.3. 写作风格&lt;/h3&gt;
&lt;p&gt;尽量不使用被动语态，改为使用主动语态。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：假如此软件尚未被安装，

正例：假如尚未安装这个软件，
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不使用非正式的语言风格。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：Lady Gaga 的演唱会真是酷毙了，从没看过这么给力的表演！！！

正例：无法参加本次活动，我深感遗憾。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用对 “的”、“地”、“得”。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;她露出了开心的笑容。
（形容词＋的＋名词）

她开心地笑了。
（副词＋地＋动词）

她笑得很开心。
（动词＋得＋副词）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用代词时（比如 “其”、“该”、“此”、“这” 等词），必须明确指代的内容，保证只有一个含义。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：从管理系统可以监视中继系统和受其直接控制的分配系统。

正例：从管理系统可以监视两个系统：中继系统和受中继系统直接控制的分配系统。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;名词前不要使用过多的形容词。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：此设备的使用必须在接受过本公司举办的正式的设备培训的技师的指导下进行。

正例：此设备必须在技师的指导下使用，且指导技师必须接受过由本公司举办的正式设备培训。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;单个句子的长度尽量保持在 20 个字以内；20 ～ 29 个字的句子，可以接受；30 ～ 39 个字的句子，语义必须明确，才能接受；多于 40 个字的句子，在任何情况下都不能接受。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：本产品适用于从由一台服务器进行动作控制的单一节点结构到由多台服务器进行动作控制的并行处理程序结构等多种体系结构。

正例：本产品适用于多种体系结构。无论是由一台服务器（单一节点结构），还是由多台服务器（并行处理结构）进行动作控制，均可以使用本产品。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样一个意思，尽量使用肯定句表达，不使用否定句表达。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：请确认没有接通装置的电源。

正例：请确认装置的电源已关闭。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;避免使用双重否定句。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：没有删除权限的用户，不能删除此文件。

正例：用户必须拥有删除权限，才能删除此文件。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;24-英文处理&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#24-英文处理&#34;&gt;#&lt;/a&gt; 2.4. 英文处理&lt;/h3&gt;
&lt;p&gt;英文原文如果使用了复数形式，翻译成中文时，应该将其还原为单数形式。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;英文：⋯information stored in random access memory (RAMs)⋯

中文：……存储在随机存取存储器（RAM）里的信息……
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;外文缩写可以使用半角圆点 ( &lt;code&gt;.&lt;/code&gt; ) 表示缩写。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;U.S.A.
Apple, Inc.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表示中文时，英文省略号（ &lt;code&gt;⋯&lt;/code&gt; ）应改为中文省略号（ &lt;code&gt;……&lt;/code&gt; ）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;英文：5 minutes later⋯

中文：5 分钟过去了⋯⋯
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;英文书名或电影名改用中文表达时，双引号应改为书名号。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;英文：He published an article entitled &amp;quot;The Future of the Aviation&amp;quot;.

中文：他发表了一篇名为《航空业的未来》的文章。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次出现英文词汇时，在括号中给出中文标注。此后再次出现时，直接使用英文缩写即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IOC（International Olympic Committee，国际奥林匹克委员会）。这样定义后，便可以直接使用“IOC”了。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;专有名词中每个词第一个字母均应大写，非专有名词则不需要大写。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;“American Association of Physicists in Medicine”（美国医学物理学家协会）是专有名词，需要大写。

“online transaction processing”（在线事务处理）不是专有名词，不应大写。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;3-段落&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-段落&#34;&gt;#&lt;/a&gt; 3. 段落&lt;/h2&gt;
&lt;h3 id=&#34;31-段落原则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#31-段落原则&#34;&gt;#&lt;/a&gt; 3.1. 段落原则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一个段落只能有一个主题，或一个中心句子。&lt;/li&gt;
&lt;li&gt;段落的中心句子放在段首，对全段内容进行概述。后面陈述的句子为核心句服务。&lt;/li&gt;
&lt;li&gt;一个段落的长度不能超过七行，最佳段落长度小于等于四行。&lt;/li&gt;
&lt;li&gt;段落的句子语气要使用陈述和肯定语气，避免使用感叹语气。&lt;/li&gt;
&lt;li&gt;段落之间使用一个空行隔开。&lt;/li&gt;
&lt;li&gt;段落开头不要留出空白字符。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;32-引用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#32-引用&#34;&gt;#&lt;/a&gt; 3.2. 引用&lt;/h3&gt;
&lt;p&gt;引用第三方内容时，应注明出处。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;One man’s constant is another man’s variable. — Alan Perlis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是全篇转载，请在全文开头显著位置注明作者和出处，并链接至原文。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;本文转载自 WikiQuote
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用外部图片时，必须在图片下方或文末标明来源。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;本文部分图片来自 Wikipedia
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;33-强调&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#33-强调&#34;&gt;#&lt;/a&gt; 3.3. 强调&lt;/h3&gt;
&lt;p&gt;一些特殊的强调内容可以按照如下方式书写：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🔔 『注意』&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 『提示』&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📚 『参考』&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;4-数值&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4-数值&#34;&gt;#&lt;/a&gt; 4. 数值&lt;/h2&gt;
&lt;h3 id=&#34;41-半角数字&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#41-半角数字&#34;&gt;#&lt;/a&gt; 4.1. 半角数字&lt;/h3&gt;
&lt;p&gt;数字一律使用半角形式，不得使用全角形式。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例： 这件商品的价格是１０００元。

正例： 这件商品的价格是 1000 元。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;42-千分号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#42-千分号&#34;&gt;#&lt;/a&gt; 4.2. 千分号&lt;/h3&gt;
&lt;p&gt;数值为千位以上，应添加千分号（半角逗号）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;XXX 公司的实收资本为 RMB1,258,000。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 4 ～ 6 位的数值，千分号是选用的，比如 &lt;code&gt;1000&lt;/code&gt;  和 &lt;code&gt;1,000&lt;/code&gt;  都可以接受。对于 7 位及以上的数值，千分号是必须的。&lt;/p&gt;
&lt;p&gt;多位小数要从小数点后从左向右添加千分号，比如 &lt;code&gt;4.234,345&lt;/code&gt; 。&lt;/p&gt;
&lt;h3 id=&#34;43-货币&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#43-货币&#34;&gt;#&lt;/a&gt; 4.3. 货币&lt;/h3&gt;
&lt;p&gt;货币应为阿拉伯数字，并在数字前写出货币符号，或在数字后写出货币中文名称。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$1,000
1,000 美元
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;44-数值范围&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#44-数值范围&#34;&gt;#&lt;/a&gt; 4.4. 数值范围&lt;/h3&gt;
&lt;p&gt;表示数值范围时，用 &lt;code&gt;～&lt;/code&gt; 连接。参见《标点符号》一节的 “连接号” 部分。&lt;/p&gt;
&lt;p&gt;带有单位或百分号时，两个数字都要加上单位或百分号，不能只加后面一个。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：132～234kg
正例：132kg～234kg

反例：67～89%
正例：67%～89%
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;45-变化程度的表示法&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#45-变化程度的表示法&#34;&gt;#&lt;/a&gt; 4.5. 变化程度的表示法&lt;/h3&gt;
&lt;p&gt;数字的增加要使用 “增加了”、“增加到”。“了” 表示增量，“到” 表示定量。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;增加到过去的两倍
（过去为一，现在为二）

增加了两倍
（过去为一，现在为三）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数字的减少要使用 “降低了”、“降低到”。“了” 表示增量，“到” 表示定量。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;降低到百分之八十
（定额是一百，现在是八十）

降低了百分之八十
（原来是一百，现在是二十）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不能用 “降低 N 倍” 或 “减少 N 倍” 的表示法，要用 “降低百分之几” 或 “减少百分之几”。因为减少（或降低）一倍表示数值原来为一百，现在等于零。&lt;/p&gt;
&lt;h2 id=&#34;5-符号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5-符号&#34;&gt;#&lt;/a&gt; 5. 符号&lt;/h2&gt;
&lt;h3 id=&#34;51-符号原则&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#51-符号原则&#34;&gt;#&lt;/a&gt; 5.1. 符号原则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;中文语句的标点符号，均应该采取全角符号，这样可以保证视觉的一致。&lt;/li&gt;
&lt;li&gt;如果整句为英文，则该句使用英文 / 半角标点。&lt;/li&gt;
&lt;li&gt;句号、问号、叹号、逗号、顿号、分号和冒号不得出现在一行之首。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;52-句号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#52-句号&#34;&gt;#&lt;/a&gt; 5.2. 句号&lt;/h3&gt;
&lt;p&gt;中文语句中的结尾处应该用全角句号（ &lt;code&gt;。&lt;/code&gt; ）。&lt;/p&gt;
&lt;p&gt;句子末尾用括号加注时，句号应在括号之外。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：关于文件的输出，请参照第 1.3 节（见第 26 页。）

正例：关于文件的输出，请参照第 1.3 节（见第 26 页）。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;53-逗号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#53-逗号&#34;&gt;#&lt;/a&gt; 5.3. 逗号&lt;/h3&gt;
&lt;p&gt;逗号 &lt;code&gt;，&lt;/code&gt; 表示句子内部的一般性停顿。&lt;/p&gt;
&lt;p&gt;注意避免 “一逗到底”，即整个段落除了结尾，全部停顿都使用逗号。&lt;/p&gt;
&lt;h3 id=&#34;54-顿号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#54-顿号&#34;&gt;#&lt;/a&gt; 5.4. 顿号&lt;/h3&gt;
&lt;p&gt;句子内部的并列词，应该用全角顿号 ( &lt;code&gt;、&lt;/code&gt; ) 分隔，而不用逗号，即使并列词是英语也是如此。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：我最欣赏的科技公司有 Google, Facebook, 腾讯, 阿里和百度等。

正例：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;英文句子中，并列词语之间使用半角逗号（ &lt;code&gt;,&lt;/code&gt; ）分隔。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：Microsoft Office includes Word, Excel, PowerPoint, Outlook and other components.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;55-分号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#55-分号&#34;&gt;#&lt;/a&gt; 5.5. 分号&lt;/h3&gt;
&lt;p&gt;分号 &lt;code&gt;；&lt;/code&gt; 表示复句内部并列分句之间的停顿。&lt;/p&gt;
&lt;h3 id=&#34;56-引号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#56-引号&#34;&gt;#&lt;/a&gt; 5.6. 引号&lt;/h3&gt;
&lt;p&gt;引用时，应该使用全角双引号（ &lt;code&gt;“ ”&lt;/code&gt; ），注意前后双引号不同。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：许多人都认为客户服务的核心是“友好”和“专业”。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;引号里面还要用引号时，外面一层用双引号，里面一层用单引号（ &lt;code&gt;‘ ’&lt;/code&gt; ），注意前后单引号不同。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：鲍勃解释道：“我要放音乐，可萨利说，‘不行！’。”
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;57-圆括号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#57-圆括号&#34;&gt;#&lt;/a&gt; 5.7. 圆括号&lt;/h3&gt;
&lt;p&gt;补充说明时，使用全角圆括号 &lt;code&gt;（）&lt;/code&gt; ，括号前后不加空格。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：请确认所有的连接（电缆和接插件）均安装牢固。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;58-冒号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#58-冒号&#34;&gt;#&lt;/a&gt; 5.8. 冒号&lt;/h3&gt;
&lt;p&gt;全角冒号（ &lt;code&gt;：&lt;/code&gt; ）常用在需要解释的词语后边，引出解释和说明。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：请确认以下几项内容：时间、地点、活动名称，以及来宾数量。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表示时间时，应使用半角冒号（ &lt;code&gt;:&lt;/code&gt; ）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：早上 8:00
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;59-省略号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#59-省略号&#34;&gt;#&lt;/a&gt; 5.9. 省略号&lt;/h3&gt;
&lt;p&gt;省略号 &lt;code&gt;……&lt;/code&gt;  表示语句未完、或者语气的不连续。它占两个汉字空间、包含六个省略点，不要使用 &lt;code&gt;。。。&lt;/code&gt; 或 &lt;code&gt;...&lt;/code&gt;  等非标准形式。&lt;/p&gt;
&lt;p&gt;省略号不应与 “等” 这个词一起使用。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：我们为会餐准备了香蕉、苹果、梨…等各色水果。

正例：我们为会餐准备了各色水果，有香蕉、苹果、梨……

正例：我们为会餐准备了香蕉、苹果、梨等各色水果。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;510-感叹号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#510-感叹号&#34;&gt;#&lt;/a&gt; 5.10. 感叹号&lt;/h3&gt;
&lt;p&gt;应该使用平静的语气叙述，尽量避免使用感叹号 &lt;code&gt;！&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;不得多个感叹号连用，比如 &lt;code&gt;！！&lt;/code&gt; 和 &lt;code&gt;!!!&lt;/code&gt; 。&lt;/p&gt;
&lt;h3 id=&#34;511-破折号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#511-破折号&#34;&gt;#&lt;/a&gt; 5.11. 破折号&lt;/h3&gt;
&lt;p&gt;破折号 &lt;code&gt;————&lt;/code&gt;  一般用于做进一步解释。破折号应占两个汉字的位置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：直觉————尽管它并不总是可靠的————告诉我，这事可能出了些问题。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&#34;512-连接号&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#512-连接号&#34;&gt;#&lt;/a&gt; 5.12. 连接号&lt;/h3&gt;
&lt;p&gt;连接号用于连接两个类似的词。&lt;/p&gt;
&lt;p&gt;以下场合应该使用直线连接号（ &lt;code&gt;-&lt;/code&gt; ），占一个半角字符的位置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两个名词的复合&lt;/li&gt;
&lt;li&gt;图表编号&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;例句：氧化-还原反应

例句：图 1-1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下场合应该使用波浪连接号（ &lt;code&gt;～&lt;/code&gt; ），占一个全角字符的位置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数值范围（例如日期、时间或数字）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;例句：2009 年～2011 年
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，波浪连接号前后两个值都应该加上单位。&lt;/p&gt;
&lt;p&gt;波浪连接号也可以用汉字 “至” 代替。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;例句：周围温度：-20°C 至 -10°C
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;6-结构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#6-结构&#34;&gt;#&lt;/a&gt; 6. 结构&lt;/h2&gt;
&lt;h3 id=&#34;61-目录结构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#61-目录结构&#34;&gt;#&lt;/a&gt; 6.1. 目录结构&lt;/h3&gt;
&lt;p&gt;技术手册目录结构是一部完整的书，建议采用下面的结构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;（Introduction） - [必选][目录 | 文件] 提供对产品和文档本身的总体的、扼要的说明&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;入门篇&lt;/strong&gt;（Quickstart） - [可选][文件] 如何最快速地使用产品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基础篇&lt;/strong&gt;（Basics） - [必选][目录] 又称” 使用篇 “，提供初级的使用教程
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;环境准备&lt;/strong&gt;（Prerequisite） - [可选][文件] 软件使用需要满足的前置条件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装&lt;/strong&gt;（Installation） - [可选][文件] 软件的安装方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置&lt;/strong&gt;（Configuration） - [可选][目录 | 文件] 软件的配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特性&lt;/strong&gt;（Feature） - [必选][目录 | 文件] 软件的功能特性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进阶篇&lt;/strong&gt;（Advanced） - [可选][目录] 又称” 开发篇 “，提供中高级的开发教程
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;（Principle） - [可选][目录 | 文件] 软件的原理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计&lt;/strong&gt;（Design） - [可选][目录 | 文件] 软件的设计，如：架构、设计思想等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实战篇&lt;/strong&gt;（Action） - [可选][目录] 提供一些具有实战意义的示例说明&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API&lt;/strong&gt;（API） - [可选][目录 | 文件] 软件 API 的逐一介绍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见问题&lt;/strong&gt;（FAQ） - [可选][目录 | 文件] 常见问题解答&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;附录&lt;/strong&gt;（Appendix） - [可选][目录] 不属于教程本身、但对阅读教程有帮助的内容
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;命令&lt;/strong&gt;（Command） - [可选][目录] 命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源&lt;/strong&gt;（Resource） - [必选][文件] 资源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;术语&lt;/strong&gt;（Glossary） - [可选][文件] 名词解释&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技巧&lt;/strong&gt;（Recipe） - [可选][文件] 最佳实践&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;版本&lt;/strong&gt;（Changelog） - [可选][文件] 版本说明&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反馈&lt;/strong&gt;（Feedback） - [可选][文件] 反馈方式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是两个真实范例，可参考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3JlZHV4LmpzLm9yZy9pbmRleC5odG1s&#34;&gt;Redux 手册&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL2ZsaWdodC1tYW51YWwuYXRvbS5pby8=&#34;&gt;Atom 手册&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;62-文件名&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#62-文件名&#34;&gt;#&lt;/a&gt; 6.2. 文件名&lt;/h3&gt;
&lt;p&gt;文档的文件名不得含有空格。&lt;/p&gt;
&lt;p&gt;文件名必须使用半角字符，不得使用全角字符。这也意味着，中文不能用于文件名。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例： 名词解释.md

正例： glossary.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件名建议只使用小写字母，不使用大写字母。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：TroubleShooting.md

正例：troubleshooting.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了醒目，某些说明文件的文件名，可以使用大写字母，比如 &lt;code&gt;README&lt;/code&gt; 、 &lt;code&gt;LICENSE&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;文件名包含多个单词时，单词之间建议使用半角的连词线（ &lt;code&gt;-&lt;/code&gt; ）分隔。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;反例：advanced_usage.md

正例：advanced-usage.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;7-emoji&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#7-emoji&#34;&gt;#&lt;/a&gt; 7. Emoji&lt;/h2&gt;
&lt;p&gt;在 markdown 文档中，普遍会使用 emoji，帮助理解内容。但是，如果滥用 emoji，可能会适得其反。&lt;/p&gt;
&lt;p&gt;这里，将一些比较约定俗成的 emoji 表情使用场景列举一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;💡 提示 - [推荐]&lt;/li&gt;
&lt;li&gt;🔔 注意、警告 - [推荐]&lt;/li&gt;
&lt;li&gt;⭕ 正确 - [推荐]&lt;/li&gt;
&lt;li&gt;❌ 错误 - [推荐]&lt;/li&gt;
&lt;li&gt;❓ 问题 - [推荐]&lt;/li&gt;
&lt;li&gt;⛔ 禁止 - [推荐]&lt;/li&gt;
&lt;li&gt;🚧 未完待续、有待补充 - [推荐]&lt;/li&gt;
&lt;li&gt;📚 参考、参考资料 - [可选]&lt;/li&gt;
&lt;li&gt;⌨ 源码 - [可选]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;8-参考&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#8-参考&#34;&gt;#&lt;/a&gt; 8. 参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3dlbmt1LmJhaWR1LmNvbS92aWV3LzIzY2MxYTY1MjdkMzI0MGM4NDQ3ZWZiZi5odG1s&#34;&gt;产品手册中文写作规范&lt;/span&gt;，by 华为&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL2RvY3MuZGFvY2xvdWQuaW8vd3JpdGUtZG9jcy9mb3JtYXQ=&#34;&gt;写作规范和格式规范&lt;/span&gt;，by DaoCloud&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy5oaXRhY2hpLXRjLmNvLmpwL2NvbXBhbnkvdGhlc2lzL3RoZXNpcy5wZGY=&#34;&gt;技术写作技巧在日汉翻译中的应用&lt;/span&gt;，by 刘方&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly93d3cubGVuZ29vLmRlL2RvY3VtZW50cy9zdHlsZWd1aWRlcy9sZW5nb29fc3R5bGVndWlkZV9aSC5wZGY=&#34;&gt;简体中文规范指南&lt;/span&gt;，by lengoo&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9vcGVuLmxlYW5jbG91ZC5jbi9jb3B5d3JpdGluZy1zdHlsZS1ndWlkZS5odG1s&#34;&gt;文档风格指南&lt;/span&gt;，by LeanCloud&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xUjhsTUNQZjZ6Q0Q1S0VBOGVrWjVrbks3N2l3OUotdko2dkVvcFBlbXFaTS9lZGl0&#34;&gt;豌豆荚文案风格指南&lt;/span&gt;，by 豌豆荚&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly9naXRodWIuY29tL3NwYXJhbm9pZC9jaGluZXNlLWNvcHl3cml0aW5nLWd1aWRlbGluZXM=&#34;&gt;中文文案排版指北&lt;/span&gt;，by sparanoid&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3czYy5naXRodWIuaW8vY2xyZXEv&#34;&gt;中文排版需求&lt;/span&gt;，by W3C&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3d3dy5ydWFueWlmZW5nLmNvbS9ibG9nLzIwMTcvMDIvZmlsZW5hbWUtc2hvdWxkLWJlLWxvd2VyY2FzZS5odG1s&#34;&gt;为什么文件名要小写？&lt;/span&gt;, by 阮一峰&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/890fcec5/</guid>
            <title>嵌入式编程技巧项目启动说明书</title>
            <link>https://metal-heart.github.io/posts/890fcec5/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="工作效率" scheme="https://metal-heart.github.io/categories/work/efficiency/" />
            <category term="嵌入式编程" scheme="https://metal-heart.github.io/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%BC%96%E7%A8%8B/" />
            <category term="教程" scheme="https://metal-heart.github.io/tags/%E6%95%99%E7%A8%8B/" />
            <pubDate>Mon, 01 Nov 2021 20:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;centerfont-size12b嵌入式编程技巧项目启动说明书bfontcenter&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#centerfont-size12b嵌入式编程技巧项目启动说明书bfontcenter&#34;&gt;#&lt;/a&gt; &amp;lt;center&amp;gt;&amp;lt;font size=12&amp;gt;&amp;lt;b &amp;gt; 嵌入式编程技巧项目启动说明书 &amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文档状态&lt;/th&gt;
&lt;th&gt;文档标志&lt;/th&gt;
&lt;th&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovL3huLS0wMS0tZ2U5ZHI4cTlxY2I3M2NtaDJhOXMzYnZmMGEubWQ=&#34;&gt;01 - 项目启动说明书.md&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;审核人&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[√] 草   稿&lt;/td&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;v0.1&lt;/td&gt;
&lt;td&gt;审核日期&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[ ] 正式发布&lt;/td&gt;
&lt;td&gt;作者&lt;/td&gt;
&lt;td&gt;将狼才鲸&lt;/td&gt;
&lt;td&gt;批准人&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[ ] 正在修改&lt;/td&gt;
&lt;td&gt;完成日期&lt;/td&gt;
&lt;td&gt;2020-03-23&lt;/td&gt;
&lt;td&gt;批准日期&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;center&amp;gt; 版本历史 &amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本 / 状态&lt;/th&gt;
&lt;th&gt;作者&lt;/th&gt;
&lt;th&gt;参与者&lt;/th&gt;
&lt;th&gt;起止日期&lt;/th&gt;
&lt;th&gt;修订说明&lt;/th&gt;
&lt;th&gt;批准人&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;lt;center&amp;gt; 项目组成员 &amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目负责人&lt;/th&gt;
&lt;th&gt;将狼才鲸&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;产品经理&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;项目经理&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;需求团队&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;设计团队&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开发团队&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;测试团队&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置管理人员&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;质量保证人员&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1 id=&#34;负一-项目简介&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#负一-项目简介&#34;&gt;#&lt;/a&gt; 负一、项目简介&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;附加章节。本章是项目和产品初步说明和构想，最终的产品信息在后续的《产品定义说明书》中确定。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;-11-产品说明&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-11-产品说明&#34;&gt;#&lt;/a&gt; -1.1 产品说明&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：嵌入式实用示例代码展示&lt;br /&gt;
&lt;strong&gt;编辑 / 编译环境&lt;/strong&gt;：Ubuntu Linux、Windows&lt;br /&gt;
&lt;strong&gt; 运行环境&lt;/strong&gt;：Ubuntu Linux、硬件仿真器：SkyEye/ARMulator/Softgun/RealBoard/QEMU/Protenus/Keil/RTSM、目标开发板&lt;br /&gt;
&lt;strong&gt;使用语言&lt;/strong&gt;：C、C++、汇编等&lt;br /&gt;
&lt;strong&gt;控制&lt;/strong&gt;：Console 控制台、Ncurses 基于文本的用户界面、QT、Web&lt;br /&gt;
&lt;strong&gt; 接口&lt;/strong&gt;：API、私有通讯协议&lt;br /&gt;
&lt;strong&gt;用途&lt;/strong&gt;：展示嵌入式编程技巧、架构、模块&lt;br /&gt;
&lt;strong&gt;目标群体&lt;/strong&gt;：入门嵌入式编程的人员、工作中查找技术实现的人员&lt;br /&gt;
&lt;strong&gt;要求&lt;/strong&gt;：文档齐全、从易到难、有目录索引、模块独立不耦合、以实用为准&lt;/p&gt;
&lt;h2 id=&#34;-12-项目背景&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-12-项目背景&#34;&gt;#&lt;/a&gt; -1.2 项目背景&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;因为UP主想自己从头到尾做一个项目。
一是记录自己的经验，方便以后工作中要用到时回来查看抄代码；
二是做出东西时能不断给自己成就感，打发晚上和周末漫长的时间；
三是如果能帮助到任何人也是很美好的一件事。
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;〇-项目流程&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#〇-项目流程&#34;&gt;#&lt;/a&gt; 〇、项目流程&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;本章是附加章节，主要介绍一个项目的完整生命周期所需要的操作步骤，进行一下项目管理知识普及，实际的《项目启动说明书》从第一章开始。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;01-项目启动阶段&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#01-项目启动阶段&#34;&gt;#&lt;/a&gt; 0.1 项目启动阶段&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;项目启动由项目负责人或者启动过程组成员负责，项目启动的初始原因可能是负责人的灵感、负责人发现商机、产品更新迭代、竞争对手推出新品等等。
项目启动以项目启动会的召开为标志，在项目启动会召开之前需要准备以下材料：
输出文档：《项目启动说明书》
项目启动说明书中包含以下章节：
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;产品定义&lt;/th&gt;
&lt;th&gt;需求计划&lt;/th&gt;
&lt;th&gt;项目计划&lt;/th&gt;
&lt;th&gt;人员配置&lt;/th&gt;
&lt;th&gt;规章制度&lt;/th&gt;
&lt;th&gt;风险预估&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;产品描述&lt;/td&gt;
&lt;td&gt;调研计划&lt;/td&gt;
&lt;td&gt;实施计划&lt;/td&gt;
&lt;td&gt;项目负责人&lt;/td&gt;
&lt;td&gt;项目管理&lt;/td&gt;
&lt;td&gt;骨干人员流动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主要功能&lt;/td&gt;
&lt;td&gt;调研问卷 数据采集表&lt;/td&gt;
&lt;td&gt;时间安排 里程碑计划 进度检查&lt;/td&gt;
&lt;td&gt;产品经理&lt;/td&gt;
&lt;td&gt;项目开发流程&lt;/td&gt;
&lt;td&gt;团队氛围涣散&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;产品特色&lt;/td&gt;
&lt;td&gt;调研记录&lt;/td&gt;
&lt;td&gt;开发计划&lt;/td&gt;
&lt;td&gt;项目经理&lt;/td&gt;
&lt;td&gt;需求变更流程&lt;/td&gt;
&lt;td&gt;进度延后&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实施的意义&lt;/td&gt;
&lt;td&gt;调研总结&lt;/td&gt;
&lt;td&gt;资源 预算 成本计划&lt;/td&gt;
&lt;td&gt;客户代表&lt;/td&gt;
&lt;td&gt;版本控制章程&lt;/td&gt;
&lt;td&gt;质量不达标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;提交产物 完成标记  成果展望&lt;/td&gt;
&lt;td&gt;系统分析&lt;/td&gt;
&lt;td&gt;交付物计划&lt;/td&gt;
&lt;td&gt;开发团队&lt;/td&gt;
&lt;td&gt;保密制度&lt;/td&gt;
&lt;td&gt;成本超支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;约束条件 支持的操作系统 接口&lt;/td&gt;
&lt;td&gt;可行性分析&lt;/td&gt;
&lt;td&gt;沟通计划&lt;/td&gt;
&lt;td&gt;测试团队&lt;/td&gt;
&lt;td&gt;Bug 追踪流程&lt;/td&gt;
&lt;td&gt;需求频繁变更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标用户&lt;/td&gt;
&lt;td&gt;竞品分析&lt;/td&gt;
&lt;td&gt;质量控制计划&lt;/td&gt;
&lt;td&gt;人员与职责&lt;/td&gt;
&lt;td&gt;奖惩制度&lt;/td&gt;
&lt;td&gt;目标及需求不明确&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;项目范围 使用场景 项目目标&lt;/td&gt;
&lt;td&gt;商业价值&lt;/td&gt;
&lt;td&gt;风险控制计划&lt;/td&gt;
&lt;td&gt;组织结构&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;人员技能不足&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;项目背景&lt;/td&gt;
&lt;td&gt;规格说明书&lt;/td&gt;
&lt;td&gt;用户培训计划&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;市场萎缩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;成本要求&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;竞品增加&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;《项目启动说明书》&lt;/p&gt;
&lt;h2 id=&#34;02-需求分析阶段&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#02-需求分析阶段&#34;&gt;#&lt;/a&gt; 0.2 需求分析阶段&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需求定义&lt;/th&gt;
&lt;th&gt;竞品分析&lt;/th&gt;
&lt;th&gt;市场调研&lt;/th&gt;
&lt;th&gt;商业价值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;功能 子功能 接口&lt;/td&gt;
&lt;td&gt;公司背景&lt;/td&gt;
&lt;td&gt;用户需求&lt;/td&gt;
&lt;td&gt;项目价值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能需求&lt;/td&gt;
&lt;td&gt;用户数量&lt;/td&gt;
&lt;td&gt;功能满意度&lt;/td&gt;
&lt;td&gt;社会价值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可靠性需求&lt;/td&gt;
&lt;td&gt;融资进展&lt;/td&gt;
&lt;td&gt;功能接受度&lt;/td&gt;
&lt;td&gt;用户价值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;响应时间&lt;/td&gt;
&lt;td&gt;特色功能&lt;/td&gt;
&lt;td&gt;用户访谈&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可扩展性&lt;/td&gt;
&lt;td&gt;交互分析&lt;/td&gt;
&lt;td&gt;利润导向&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据流图&lt;/td&gt;
&lt;td&gt;用户评论&lt;/td&gt;
&lt;td&gt;市场的问题&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运行环境 设计约束&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;市场的机会&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;《需求规格说明书》&lt;/p&gt;
&lt;h2 id=&#34;03-概要设计阶段&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#03-概要设计阶段&#34;&gt;#&lt;/a&gt; 0.3 概要设计阶段&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;系统架构&lt;/th&gt;
&lt;th&gt;系统框图&lt;/th&gt;
&lt;th&gt;架构&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;系统分析评审&lt;/td&gt;
&lt;td&gt;系统流程图&lt;/td&gt;
&lt;td&gt;顺序执行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;概要设计说明书&lt;/td&gt;
&lt;td&gt;开发系统&lt;/td&gt;
&lt;td&gt;时间片切分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统框架&lt;/td&gt;
&lt;td&gt;目标系统&lt;/td&gt;
&lt;td&gt;模块路由&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;稳定性&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;状态机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;远程升级&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安全性&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;《概要设计说明书》&lt;/p&gt;
&lt;h2 id=&#34;04-详细设计阶段&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#04-详细设计阶段&#34;&gt;#&lt;/a&gt; 0.4 详细设计阶段&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;详细设计文档&lt;/th&gt;
&lt;th&gt;模块设计文档&lt;/th&gt;
&lt;th&gt;单元测试文档&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;接口说明&lt;/td&gt;
&lt;td&gt;函数功能接口&lt;/td&gt;
&lt;td&gt;单元测试用例&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API 接口函数说明&lt;/td&gt;
&lt;td&gt;数据结构&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;通讯协议&lt;/td&gt;
&lt;td&gt;全局变量&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块划分&lt;/td&gt;
&lt;td&gt;文件读写&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;错误输出模块&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;05-开发&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#05-开发&#34;&gt;#&lt;/a&gt; 0.5 开发&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;系统原型、《编码规范》、代码管理规范、设计文档规范、交叉审核
分支管理、bug追踪、进度报告、版本号说明、CICD自动测试自动发布
系统分析文档
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;06-测试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#06-测试&#34;&gt;#&lt;/a&gt; 0.6 测试&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;《测试大纲》、测试计划、测试报告、问题清单、测试用例、产品集成测试
功能测试、压力测试、性能测试（提供性能参数）、抗干扰测试
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;07-交付发布&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#07-交付发布&#34;&gt;#&lt;/a&gt; 0.7 交付 / 发布&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;用户说明、产品说明、项目总结、系统管理手册、安装配置手册、用户操作手册
用户培训计划、用户培训教程、系统上线报告、问题清单、项目验收报告、项目总结报告
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;08-售后与升级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#08-售后与升级&#34;&gt;#&lt;/a&gt; 0.8 售后与升级&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;用户体验调查、缺陷追踪
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;一-产品定义&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#一-产品定义&#34;&gt;#&lt;/a&gt; 一、产品定义&lt;/h1&gt;
&lt;p&gt;==== 产品定义&lt;br /&gt;
一款展示嵌入式软件编程规范和技巧的源码库，可以在 Ubuntu 主机 / 硬件仿真器 / 实际开发板运行的软件系统，包含从简答单个训练用例到复杂软件系统的全套开发文档和源码，可读、可仿真、可运行。&lt;br /&gt;
逐步展示嵌入式软件 C 语言编程技巧：编程规范、注释规范、源文件管理、编译控制、版本命名、模块编写、驱动编写、应用编写、协议设计、网络编程、系统架构、模块设计、接口设计、人机交互、单元测试、算法优化、版本管理……&lt;/p&gt;
&lt;h1 id=&#34;二-需求计划&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#二-需求计划&#34;&gt;#&lt;/a&gt; 二、需求计划&lt;/h1&gt;
&lt;p&gt;==== 需求定义&lt;br /&gt;
一键确定主机性能 确定主机环境 确定编译工具 确定测试环境（字符串菜单 qt web 文档在线查看） boot 选择 区分有无 MMU&lt;/p&gt;
&lt;h1 id=&#34;三-项目计划&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#三-项目计划&#34;&gt;#&lt;/a&gt; 三、项目计划&lt;/h1&gt;
&lt;p&gt;==== 一些准则&lt;br /&gt;
要做的功能都是自己会做的，不需要太多学习&lt;br /&gt;
作出的东西都是有实际作用 复杂的工程不替换一开始简单的功能，让人可以从最简单的开始慢慢接触&lt;br /&gt;
成品至少包含嵌入式中每一个方向。命名：模块名 + 系统名 + 芯片名 + 板级，所有设备上线探测，&lt;br /&gt;
代码有不加宏定义的版本，有加宏定义的版本​&lt;br /&gt;
首先要是自己都会的，然后所有的东西都有实际用处，其次要循序渐进各步骤的代码都有，搜索 arm 模拟器，51protenus 单片机模拟器，确定使用仿真平台。目的是使用所有能仿真的外设，做网络通讯产品控制别人的传感器执行器。有多少玩就能相互控制多少人的设备。所有的例程都应用在仿真器中，但是也要保证能稍作修改就能跑到实际硬件中。目的是所有跑起来的程序都有相互通信的可能。可以连一个网站，可以查找哪些设备在线，专门用来受理不同主机的网络请求，使两台设备相互通讯。第一阶段把编程规范说清楚就行。出一个 git 使用教程，实例解说。&lt;br /&gt;
（画出组织结构图）&lt;/p&gt;
&lt;h1 id=&#34;四-人员配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#四-人员配置&#34;&gt;#&lt;/a&gt; 四、人员配置&lt;/h1&gt;
&lt;h1 id=&#34;五-规章制度&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#五-规章制度&#34;&gt;#&lt;/a&gt; 五、规章制度&lt;/h1&gt;
&lt;p&gt;==== 沟通方案&lt;br /&gt;
微信群、邮件、gitee 留言、钉钉工时打卡&lt;br /&gt;
 ==== 项目管理：禅道&lt;br /&gt;
代码管理：gitee&lt;br /&gt;
==== 项目开发流程&lt;br /&gt;
文档、表格、流程图、时序图、甘特图：markdown 思维导图（脑图）：XMind&lt;br /&gt;
 瀑布开发、敏捷开发&lt;br /&gt;
部门管理与项目管理分开&lt;br /&gt;
源码文件夹划分&lt;/p&gt;
&lt;h1 id=&#34;六-风险预估&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#六-风险预估&#34;&gt;#&lt;/a&gt; 六、风险预估&lt;/h1&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/2155/</guid>
            <title>《常用shell命令整理之操作文件和目录3》</title>
            <link>https://metal-heart.github.io/posts/2155/</link>
            <category term="工具" scheme="https://metal-heart.github.io/categories/Tool/" />
            <category term="Linux" scheme="https://metal-heart.github.io/categories/Tool/Linux/" />
            <category term="编程语言" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/" />
            <category term="编程" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B/" />
            <category term="shell" scheme="https://metal-heart.github.io/tags/shell/" />
            <pubDate>Tue, 12 Oct 2021 10:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;1-hostname-查看主机名&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-hostname-查看主机名&#34;&gt;#&lt;/a&gt; 1. hostname - 查看主机名&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;hostname&lt;/code&gt;  命令用于查看系统的主机名，或是修改系统的主机名。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hostname&lt;/code&gt;  的常用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示系统的当前主机名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;hostname&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 修改你系统的主机名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;hostname&lt;/span&gt; blinkfox-system&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -F 选项，从指定的文件中读取主机名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;hostname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-F&lt;/span&gt; /root/hostname.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;2-uptime-查看系统运行时间&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-uptime-查看系统运行时间&#34;&gt;#&lt;/a&gt; 2. uptime - 查看系统运行时间&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uptime&lt;/code&gt;  命令用于打印系统的运行时间等信息。使用如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uptime&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;3-w-who-列出登录的用户&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-w-who-列出登录的用户&#34;&gt;#&lt;/a&gt; 3. w、who - 列出登录的用户&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;w&lt;/code&gt;  命令用于显示登录用户及他们当前运行的进程。输入的内容格式如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;w&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 打印如下&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token number&#34;&gt;22&lt;/span&gt;:42  up &lt;span class=&#34;token number&#34;&gt;18&lt;/span&gt; days, &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; hr, &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt; users, load averages: &lt;span class=&#34;token number&#34;&gt;1.23&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1.79&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1.75&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token environment constant&#34;&gt;USER&lt;/span&gt;     TTY      FROM              LOGIN@  IDLE WHAT&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;blinkfox console  -                日19   6days -&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;blinkfox s000     -                五23       - w&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;who&lt;/code&gt;  命令有与 &lt;code&gt;w&lt;/code&gt;  命令类似的用途，但它的功能比 &lt;code&gt;w&lt;/code&gt;  命令更强大一些。语法格式如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;FILE &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; ARG1 ARG2&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;who&lt;/code&gt;  常用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示当前登录的所有用户信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示系统的启动时间&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示系统登录进程&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-l&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示与当前标准输入关联的用户信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-m&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示系统的运行级别&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示所有登录用户的用户名和登录用户数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;who&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-q&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;4-uname-查看系统信息&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4-uname-查看系统信息&#34;&gt;#&lt;/a&gt; 4. uname - 查看系统信息&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uname&lt;/code&gt;  命令用于打印内核名称和版本、主机名等系统信息。命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常用使用方式如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 只打印内核的名称&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -n 选项，只打印系统的主机名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -r 选项，打印内核版本信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -m 选项，打印系统的硬件名称&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-m&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -p 选项，打印系统的处理器类型信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -i 选项，打印系统的硬件平台信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -a 选项，打印上述所有示例中的信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uname&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;5-date-显示和设置系统日期和时间&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5-date-显示和设置系统日期和时间&#34;&gt;#&lt;/a&gt; 5. date - 显示和设置系统日期和时间&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;date&lt;/code&gt;  命令用于以多种格式显示日期和时间，或设置系统的日期和时间。 &lt;code&gt;date&lt;/code&gt;  命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;+FORMAT&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;-u&lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt;--utc&lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt;--universal&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;MMDDhhmm&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;CC&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;YY&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;.ss&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常用使用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 以默认格式显示系统的当前日期时间&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 格式化当前日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; +&lt;span class=&#34;token string&#34;&gt;&#34;%Y-%m-%d&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 格式化输出昨天的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;1 day ago&#34;&lt;/span&gt; +&lt;span class=&#34;token string&#34;&gt;&#34;%Y-%m-%d&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 2 秒后格式化输出&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;2 second&#34;&lt;/span&gt; +&lt;span class=&#34;token string&#34;&gt;&#34;%Y-%m-%d %H:%M.%S&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 普通格式化转出&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;2009-12-12&#34;&lt;/span&gt; +&lt;span class=&#34;token string&#34;&gt;&#34;%Y/%m/%d %H:%M.%S&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# apache 格式转换&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;Dec 5, 2009 12:00:37 AM&#34;&lt;/span&gt; +&lt;span class=&#34;token string&#34;&gt;&#34;%Y-%m-%d %H:%M.%S&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 日期加减操作&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示前天年月日&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+1 day&#34;&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示前一天的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-1 day&#34;&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示后一天的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-1 month&#34;&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示上一月的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+1 month&#34;&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示下一月的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;-1 year&#34;&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示前一年的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;+1 year&#34;&lt;/span&gt; +%Y%m%d &lt;span class=&#34;token comment&#34;&gt;#显示下一年的日期&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 设定时间&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 设置当前时间，只有 root 权限才能设置，其他只能查看&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;20160816&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 设置成 20160816，这样会把具体时间设置成空 00:00:00&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; 01:01:01 &lt;span class=&#34;token comment&#34;&gt;# 设置具体时间，不会对日期做更改&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;01:01:01 2012-05-23&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 这样可以设置全部时间 &lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;01:01:01 20120523&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 这样可以设置全部时间&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;2012-05-23 01:01:01&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 这样可以设置全部时间 &lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;20120523 01:01:01&#34;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;# 这样可以设置全部时间&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;6-id-显示用户属性&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#6-id-显示用户属性&#34;&gt;#&lt;/a&gt; 6. id - 显示用户属性&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;id&lt;/code&gt;  命令用于打印输出用户 &lt;code&gt;uid&lt;/code&gt; 、 &lt;code&gt;gid&lt;/code&gt; 、用户名和组名等用户身份信息。 &lt;code&gt;id&lt;/code&gt;  命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;USERNAME&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常见使用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 输出当前用户的 uid、用户名、gid、组名及用户属于的群组信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -u 选项，输出用户的 uid&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;#-u 选项和 -n 选项结合使用，输出账户的用户名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-un&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -g 选项，输出帐号当前起作用的 gid&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-g&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -g 与 -n 选项结合使用，输出帐号当前起作用的用户组名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-gn&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -G 选项，输出帐号所属的所有群组 id&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-G&lt;/span&gt; root&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -G 与 -n 选项结合使用，输出账号所属的所有群组的名称&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-Gn&lt;/span&gt; root&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/62570/</guid>
            <title>《常用shell命令整理之操作文件和目录2》</title>
            <link>https://metal-heart.github.io/posts/62570/</link>
            <category term="工具" scheme="https://metal-heart.github.io/categories/Tool/" />
            <category term="Linux" scheme="https://metal-heart.github.io/categories/Tool/Linux/" />
            <category term="编程语言" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/" />
            <pubDate>Tue, 12 Oct 2021 10:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;1-ls-列出文件名和目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-ls-列出文件名和目录&#34;&gt;#&lt;/a&gt; 1. ls - 列出文件名和目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;  命令是 &lt;code&gt;Linux&lt;/code&gt;  中最常用的命令之一，其作用就是列出文件名和目录。在命令行提示符下，直接输入 &lt;code&gt;ls&lt;/code&gt;  命令，不带任何选项，将列出当前目录下所有文件和目录，但不会显示详细的信息，比如，文件类型、大小、修改日期和时间、权限等。&lt;/p&gt;
&lt;p&gt;以下便是 &lt;code&gt;ls&lt;/code&gt;  命令及其选项的作用说明：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 仅列出当前目录下所有文件和目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 每行显示一条记录，每条记录包括文件类型、大小、修改日期和时间、权限等&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-l&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将文件大小显示符合人类阅读习惯的格式&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-lh&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将使用不同的特殊字符归类不同的文件类型&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-F&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 以长列表格式列出某个目录的信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ld&lt;/span&gt; /var/log&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将递归地列出子目录的内容&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-R&lt;/span&gt; /etc/sysconfig/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 以长列表格式按文件或目录的修改时间倒序地列出文件和目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ltr&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 以长列表格式按文件大小顺序列出文件和目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-ls&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 列出包括隐藏文件或目录在内的所有文件和目录，包括 “.”（当前目录）和 “..”（父目录）&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;B&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 列出包括隐藏文件或目录在内的所有文件和目录，不包括 “.”（当前目录）和 “..”（父目录）&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-A&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;输出的内容类似于-l选项，指示显示uid和gid，替代显示所有者和用户组&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ls&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;2-cat-连接显示文件内容&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-cat-连接显示文件内容&#34;&gt;#&lt;/a&gt; 2. cat - 连接显示文件内容&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cat&lt;/code&gt;  命令也是 Linux 系统中最常用的命令之一。 &lt;code&gt;cat&lt;/code&gt;  命令让我们可以看看文件的内容、连接文件、创建一个或多个文件和重定向输出到终端或文件。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cat&lt;/code&gt;  命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;FILE&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;cat&lt;/code&gt;  常用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 cat 命令查看文件 /etc/group 的内容&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; /etc/group&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 显示多个文件的内容&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; /etc/redhat-release /etc/issue&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -n 选项，可以显示文件内容的行号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; /etc/fstab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -b 选项和 -n 选项类似，但只标识非空白行的行号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt; /etc/fstab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -e 选项，将在每一行的结尾显示 “$” 字符&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt; /etc/fstab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;当你只输入 cat 命令，而没有任何参数时，它只是接收标准输入的内容并在标准输出中显示。所以你在输入一行内容并回车后，会在接下来的一行显示相同的内容。你也可以重定向标准输出到一个新文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;3less-more-分屏显示文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3less-more-分屏显示文件&#34;&gt;#&lt;/a&gt; 3.less、more - 分屏显示文件&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;more&lt;/code&gt;  命令在你使用小的 xterm 窗口时，或是想不使用文本编辑器而只是简单地阅读一个文件时是很有用的。more 命令是一个用于一次翻阅一整屏文件的过滤器。&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看一个文件，自动清空屏幕并显示文件开头部分&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;more&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 指定一次显示 num 行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;more&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-num&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;与 &lt;code&gt;more&lt;/code&gt;  命令相比，我个人更喜欢 &lt;code&gt;less&lt;/code&gt;  命令来查看文件。 &lt;code&gt;less&lt;/code&gt;  命令与 &lt;code&gt;more&lt;/code&gt;  命令类似，但 &lt;code&gt;less&lt;/code&gt;  命令向前和向后翻页都支持，而且 &lt;code&gt;less&lt;/code&gt;  命令不需要在查看前加载整个文件，即 &lt;code&gt;less&lt;/code&gt;  命令查看文件更快速。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;less&lt;/code&gt;  常用命令参数如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-b&lt;/span&gt;  &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;缓冲区大小&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; 设置缓冲区的大小&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-e&lt;/span&gt;  当文件显示结束后，自动离开&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt;  强迫打开特殊文件，例如外围设备代号、目录和二进制文件&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-g&lt;/span&gt;  只标志最后搜索的关键词&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt;  忽略搜索时的大小写&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-m&lt;/span&gt;  显示类似more命令的百分比&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-N&lt;/span&gt;  显示每行的行号&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-o&lt;/span&gt;  &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;文件名&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; 将less 输出的内容在指定文件中保存起来&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-Q&lt;/span&gt;  不使用警告音&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt;  显示连续空行为一行&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-S&lt;/span&gt;  行过长时间将超出部分舍弃&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token parameter variable&#34;&gt;-x&lt;/span&gt;  &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;数字&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; 将“tab”键显示为规定的数字空格&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;/字符串：向下搜索“字符串”的功能&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;?字符串：向上搜索“字符串”的功能&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;n： 重复前一个搜索（与 / 或 ? 有关）&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;N： 反向重复前一个搜索（与 / 或 ? 有关）&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;b  向后翻一页&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;d  向后翻半页&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;h  显示帮助界面&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Q  退出less 命令&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;u  向前滚动半页&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;y  向前滚动一行&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;空格键 滚动一行&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;回车键 滚动一页&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;pagedown&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;： 向下翻动一页&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;pageup&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;：   向上翻动一页&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;4head-显示文件头部&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4head-显示文件头部&#34;&gt;#&lt;/a&gt; 4.head - 显示文件头部&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;head&lt;/code&gt;  命令用于打印指定输入的开头部分内容。默认情况下，打印每个指定输入的前 10 行内容。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;-n&lt;/code&gt;  选项可以指定打印文件的前 N 行：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 指定打印文件的前 5 行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;head&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;5&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;（或）head &lt;span class=&#34;token parameter variable&#34;&gt;-5&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 打印文件的前 N 个字节的数据&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;head&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;5tail-显示文件尾部&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5tail-显示文件尾部&#34;&gt;#&lt;/a&gt; 5.tail - 显示文件尾部&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tail&lt;/code&gt;  命令和 &lt;code&gt;head&lt;/code&gt;  命令相反，它打印指定输入的结尾部分的内容。默认情况下，它打印指定输入的最后 10 行内容。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;-n&lt;/code&gt;  选项可以指定打印文件的最后 N 行：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 指定打印文件的后 10 行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tail&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;10&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tail&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-10&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 即时打印文件中新写入的行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tail&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; /var/log/messages&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# --retry 选项表示持续尝试打开某个文件，当你想打开一个稍后才会创建或即使不可用的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tail&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; /tmp/debug.log &lt;span class=&#34;token parameter variable&#34;&gt;--retry&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;6file-查看文件类型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#6file-查看文件类型&#34;&gt;#&lt;/a&gt; 6.file - 查看文件类型&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;file&lt;/code&gt;  命令用于接收一个文件作为参数并执行某些测试，已确定正确的文件类型。&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查看文件类型&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;file&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 可以 MIME 类型的格式显示文件类型的信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt;  /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 - N 选项，输出的队列可以以在文件名之后无空白填充的形式显示&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-N&lt;/span&gt; *&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;7wc-查看文件统计信息&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#7wc-查看文件统计信息&#34;&gt;#&lt;/a&gt; 7.wc - 查看文件统计信息&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;wc&lt;/code&gt;  命令用于查看文件的行数、单词数和字符数等信息。语法类似如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wc&lt;/span&gt; filename&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;X Y Z /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;其中 X 表示行数，Y 表示单词数，Z 表示字节数，filename 表示文件名。&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -l 选项，可以只统计文件的行数信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wc&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-l&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -w 选项，可以只统计文件的单词数信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wc&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-w&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -c 选项，可以只统计文件的字节数信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wc&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# -L 选项，可以只统计文件中最长的行的长度&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;wc&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-L&lt;/span&gt; /etc/inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;8find-查找文件或目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#8find-查找文件或目录&#34;&gt;#&lt;/a&gt; 8.find - 查找文件或目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;find&lt;/code&gt;  命令用于根据你指定的参数搜索和定位文件和目录的列表。 &lt;code&gt;find&lt;/code&gt;  命令可以在多种情况下使用，比如你可以通过权限、用户、用户组、文件类型、日期、大小和其他可能的条件来查找文件。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;find&lt;/code&gt;  命令常用使用和说明如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 查找指定目录下的某个文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /etc/ &lt;span class=&#34;token parameter variable&#34;&gt;-name&lt;/span&gt; inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在当前目录下查找名称为 inittab 的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-name&lt;/span&gt; inittab&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在当前目录下，文件不区分大小写是 example 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-iname&lt;/span&gt; example&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出当前目录下所有以 sh 结尾的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-name&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;*.sh&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出当前目录下，文件权限是 777 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-perm&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;777&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出当前目录下，文件权限不是 777 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-perm&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;777&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出当前目录下所有只读文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-perm&lt;/span&gt; /a+w&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你帐号主目录下的所有可执行文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-perm&lt;/span&gt; /a+w&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出 /tmp 目录下的.log 文件并将其删除：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /tmp/ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-name&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;*.log&#34;&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-exec&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出当前目录下的所有空文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-empty&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出当前目录下的所有空目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; &lt;span class=&#34;token builtin class-name&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; d &lt;span class=&#34;token parameter variable&#34;&gt;-empty&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出 /tmp 目录下的所有隐藏文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /tmp/ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-name&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;.*&#34;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出 /tmp 目录下，所有者是 root 的文件和目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /tmp/ &lt;span class=&#34;token parameter variable&#34;&gt;-user&lt;/span&gt; root&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;39&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;40&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出 /tmp 目录下，用户组是 developer 的文件和目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;41&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /tmp/ &lt;span class=&#34;token parameter variable&#34;&gt;-group&lt;/span&gt; root&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;42&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;43&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号的主目录下，3 天前修改的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;44&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-mtime&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;45&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;46&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号的主目录下，30 天以前修改的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;47&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-mtime&lt;/span&gt; +30&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;48&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;49&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号的主目录下，3 天以内修改的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;50&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-mtime&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;51&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;52&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号的主目录下，30 天以前，60 天以内修改的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;53&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-mtime&lt;/span&gt; +30 &lt;span class=&#34;token parameter variable&#34;&gt;-mtime&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-60&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;54&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;55&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出 /etc 目录下，一小时以内变更过的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;56&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /etc &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-cmin&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-60&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;57&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;58&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出 /etc 目录下，一小时以内访问过的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;59&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; /etc &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-amin&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-60&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;60&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;61&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号主目录下，大小是 50MB 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;62&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-size&lt;/span&gt; 50MB&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;63&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;64&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号主目录下，大于 50MB 小于 100MB 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;65&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-size&lt;/span&gt; +50MB &lt;span class=&#34;token parameter variable&#34;&gt;-size&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-100MB&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;66&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;67&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 找出你账号主目录下，大于 100MB 的文件并将其删除&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;68&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt; ~ &lt;span class=&#34;token parameter variable&#34;&gt;-type&lt;/span&gt; f &lt;span class=&#34;token parameter variable&#34;&gt;-size&lt;/span&gt; +100MB &lt;span class=&#34;token parameter variable&#34;&gt;-exec&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-rf&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;&amp;#123;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;#125;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/31850/</guid>
            <title>《常用shell命令整理之操作文件和目录4》</title>
            <link>https://metal-heart.github.io/posts/31850/</link>
            <category term="工具" scheme="https://metal-heart.github.io/categories/Tool/" />
            <category term="Linux" scheme="https://metal-heart.github.io/categories/Tool/Linux/" />
            <category term="编程语言" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/" />
            <category term="编程" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B/" />
            <category term="shell" scheme="https://metal-heart.github.io/tags/shell/" />
            <pubDate>Tue, 12 Oct 2021 10:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;1-sort-文本排序&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-sort-文本排序&#34;&gt;#&lt;/a&gt; 1. sort - 文本排序&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sort&lt;/code&gt;  命令用于将文本文件的行排序。默认情况下， &lt;code&gt;sort&lt;/code&gt;  命令是按照字符串的字母顺序排序。&lt;/p&gt;
&lt;p&gt;sort 的常用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将文本内容按字母顺序排序&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sort&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -u 选项，移除所有重复行后排序&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sort&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -n 选项，将令数字按数值的大小排序&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sort&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -r 选项，以倒序方式排序&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sort&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 同时将 file1、file2 的内容排序&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;sort&lt;/span&gt; file1 file2&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;2uniq-文本去重&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2uniq-文本去重&#34;&gt;#&lt;/a&gt; 2.uniq - 文本去重&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;uniq&lt;/code&gt;  命令用于移除或发现文件中重复的条目。&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 它将移除文件中重复的行并显示单一行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 可以统计重复行出现的次数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -d 选项，只显示文件中有重复的行并只显示一次&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -D 选项，显示文件中所有重复的行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-D&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -u 选项，只显示文件中不重复的行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -w 选项，限制 uniq 命令只比较每行的前 3 个字符是否重复&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-w&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -s 选项，避免 uniq 命令比较每行的前 3 个字符，只比较后面的字符是否重复&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;3&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -f 选项，避免 uniq 命令比较第一列的内容，只比较后面的字符是否重复&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;uniq&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; example.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;3tr&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3tr&#34;&gt;#&lt;/a&gt; &lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cDovLzMudHI=&#34;&gt;3.tr&lt;/span&gt; - 替换或删除字符&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tr&lt;/code&gt;  命令主要用于删除文件中控制字符或进行字符转换。使用 &lt;code&gt;tr&lt;/code&gt;  时要转换两个字符串：字符串 1 用于查询，字符串 2 用于处理各种转换。 &lt;code&gt;tr&lt;/code&gt;  刚执行时，字符串 1 中的字符被映射到字符串 2 中的字符，然后转换操作开始。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tr&lt;/code&gt;  命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. SET1 &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;SET2&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常用命令示例：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 若要将大括号转换为小括号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&amp;#123;&amp;#125;&#39;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;()&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; textfile &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; newfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 若要将大括号转换成方括号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&amp;#123;&amp;#125;&#39;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;\[]&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; textfile &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; newfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 若要将小写字符转换成大写，请输入：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;a-z&#39;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;A-Z&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; textfile &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; newfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 若要创建一个文件中的单词列表&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-cs&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;[:lower:][:upper:]&#39;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;[\n*]&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; textfile &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; newfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 若要从某个文件中删除所有空字符&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-d&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;\0&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; textfile &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; newfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 若要用单独的换行替换每一序列的一个或多个换行，请输入：&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;\n&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; textfile &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; newfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 要以单个 “#” 字符替换 &amp;lt;space&gt; 字符类中的每个字符序列&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;tr&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;[:space:]&#39;&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;[#*]&#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;4grep-查找字符串&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4grep-查找字符串&#34;&gt;#&lt;/a&gt; 4.grep - 查找字符串&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;grep&lt;/code&gt;  命令用于搜索文本或指定的文件中与指定的字符串或模式相匹配的行。默认情况下， &lt;code&gt;grep&lt;/code&gt;  命令只显示匹配的行。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grep&lt;/code&gt;  命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. PATTERN &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;FILE&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;-e PATTERN &lt;span class=&#34;token operator&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-f&lt;/span&gt; FILE&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;FILE&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# `grep` 命令查找文件 /etc/passwd 中帐号 blinkfox 的信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; blinkfox /etc/passwd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -i 选项，强制 grep 命令忽略搜索关键字的大小写&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; blinkfox /etc/passwd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -r 选项，可以递归搜索指定目录下的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt; blinkfox /etc/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -w 选项，只匹配包含指定单词的行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-w&lt;/span&gt; blinkfox /etc/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -c 选项，报告文件或文本中模式被匹配的次数&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; blinkfox /etc/passwd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -n 选项，显示每一个匹配的行的行号&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-n&lt;/span&gt; blinkfox /etc/passwd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -v 选项，可以输出除匹配指定模式的行以外的其他所有行&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-v&lt;/span&gt; blinkfox /etc/passwd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 --color 选项，在输出中将匹配的字符串以彩色的形式标出&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;grep&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;--color&lt;/span&gt; blinkfox /etc/passwd&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;5diff-比较两个文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5diff-比较两个文件&#34;&gt;#&lt;/a&gt; 5.diff - 比较两个文件&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;diff&lt;/code&gt;  命令用于比较两个文件，并找出它们之间的不同。 &lt;code&gt;diff&lt;/code&gt;  命令的语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;diff&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. from-file to-file&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常用使用方式如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 比较两个文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;diff&lt;/span&gt; nsswitch.conf nsswitch.conf.org&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -w 选项，比较时忽略空格&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;diff&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-w&lt;/span&gt; nsswitch.conf nsswitch.conf.org&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -y 选项，以并排的格式输出两个文件的比较结果&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;diff&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-y&lt;/span&gt; nsswitch.conf nsswitch.conf.org&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;使用 &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; 选项，以上下对比的格式输出两个文件的比较结果&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;diff&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; nsswitch.conf nsswitch.conf.org&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/48477/</guid>
            <title>《常用shell命令整理之操作文件和目录1》</title>
            <link>https://metal-heart.github.io/posts/48477/</link>
            <category term="工具" scheme="https://metal-heart.github.io/categories/Tool/" />
            <category term="Linux" scheme="https://metal-heart.github.io/categories/Tool/Linux/" />
            <category term="编程语言" scheme="https://metal-heart.github.io/tags/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/" />
            <pubDate>Sun, 10 Oct 2021 10:45:48 +0800</pubDate>
            <description><![CDATA[ &lt;h2 id=&#34;1-touch-创建文件&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-touch-创建文件&#34;&gt;#&lt;/a&gt; 1. touch - 创建文件&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;touch&lt;/code&gt;  命令就可用于创建、变更和修改文件的时间戳。它是 Linux 操作系统的标准程序。 &lt;code&gt;touch&lt;/code&gt;  命令又如下选项：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;-a: 只改变访问时间 &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;-c: 不创建任何文件&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;-m: 只改变修改时间&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;-r: 使用指定文件的时间替代当前时间&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;-t: 使用 &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;CC&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;YY&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;MMDDhhmm&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;.ss&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; 替代当前时间&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;touch 命令的常见用法如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建一个名为 effyl 的新空文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; effyl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 同时创建名称分别为 effyl myeffyl lueffyl 的三个文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; effyl myeffyl lueffyl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -a 选项，可以改变或更新文件的最新访问时间，如果文件 effyl 不存在，则新创建一个&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-a&lt;/span&gt; effyl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -c 选项，可以避免创建一个新文件，并用当前时间更新文件的时间戳&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; effyl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -m 选项，可以只改变文件的修改时间，而访问时间不变&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-m&lt;/span&gt; effyl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -c 和 -t 选项，来明确设置文件的时间&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-t&lt;/span&gt; YYMMDDHHMM filename&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如果想使用文件 myeffyl 的时间戳更新文件 effyl 的时间戳，可以使用 -r 选项&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;touch&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-r&lt;/span&gt; myeffyl effyl&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;2mkdir-创建目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2mkdir-创建目录&#34;&gt;#&lt;/a&gt; 2.mkdir - 创建目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt;  命令用于创建一个新目录。最基本的 &lt;code&gt;mkdir&lt;/code&gt;  命令的使用方法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在当前目录下创建一个给定的目录名&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;dirname&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在 backup 中的相对路径创建一个名为 old 的目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; backup/old&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在 backup 中的绝对路径中创建一个名为 old 的目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; /home/blinkfox/backup/old&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -p 选项，会自动创建所有还不存在的父目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; backup/old&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -m 选项，可以设置将要创建目录的权限&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 如：创建一个任何人都有读写访问权限的目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-m&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;777&lt;/span&gt; backup/old&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;3cp-复制文件或目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3cp-复制文件或目录&#34;&gt;#&lt;/a&gt; 3.cp - 复制文件或目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cp&lt;/code&gt;  命令用于将文件从一个地方复制到另一个地方。原来的文件保持不变，新文件可能保持原名或用一个不同的名字。&lt;/p&gt;
&lt;p&gt;使用 cp 命令复制文件和目录的语法有以下几种：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 复制源文件到目标文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; SOURCE DEST&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 复制一个或多个源文件到一个目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; SOURCE&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. DIRECTORY&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 同上&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTION&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-t&lt;/span&gt; DIRECTORY SOURCE&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常用使用示例如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在当前目录下，创建一个文件 file.txt 的副本，取名为 newfile.txt&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; file.txt newfile.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 复制当前目录下的 file.txt 文件到 /tmp 目录下&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; file.txt /tmp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 复制当前目录下的所有文件到 /tmp 目录下&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; * /tmp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -p 选项，可以使复制一个文件到新文件时，保留源文件的所有者、权限等信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-p&lt;/span&gt; filename /path/to/new/location/myfile&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -R 或 -r 选项，恶意递归地复制一个目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 即将一个目录及其下的所有文件和子目录都复制到另一个目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;cp&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-R&lt;/span&gt; * /home/blinkfox/backup&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;4ln-链接文件或目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4ln-链接文件或目录&#34;&gt;#&lt;/a&gt; 4.ln - 链接文件或目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ln&lt;/code&gt;  命令用于创建软链接或硬链接。使用 -s 选项，可以创建一个软链接：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 在目录 lib 下创建一个软链接 library.so，链接到 /home/blinkfox/src/library.so&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ln&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; /home/blinkfox/src/library.so /home/blinkfox/lib&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 创建目录的软链接&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;ln&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-s&lt;/span&gt; /home/blinkfox/src &lt;span class=&#34;token builtin class-name&#34;&gt;source&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;5-mv-移动文件或目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5-mv-移动文件或目录&#34;&gt;#&lt;/a&gt; 5. mv - 移动文件或目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mv&lt;/code&gt;  命令用于将文件和目录从一个位置移到另外一个位置。除了移动文件， &lt;code&gt;mv&lt;/code&gt;  命令还可用于修改文件或目录的名字。&lt;/p&gt;
&lt;p&gt;mv 命令的基本语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; SOURCE&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. DIRECTORY&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;常用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将当前目录下的文件 source.txt 移到目录 /tmp 下&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; source.txt /tmp&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将目录 dir1、dir2 移到目录 dir_dist 下&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; dir1 dir2 dir_dist&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将当前目录下的 old.txt 文件更名为 new.txt&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; old.txt new.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -i 选项，在重写覆盖目标文件或目录之前给出提示信息&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; old.txt new.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 将当前目录下的所有文件移动到目录 /tmp 下&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; * /tmp/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -i 选项，从 dir1 中移动那些在目标目录中不存在的文件到目标目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-u&lt;/span&gt; dir1/* dir2/&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;h2 id=&#34;6rm-删除文件或目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#6rm-删除文件或目录&#34;&gt;#&lt;/a&gt; 6.rm - 删除文件或目录&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rm&lt;/code&gt;  命令用于删除指定的文件和目录。其语法如下所示：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;OPTIONS&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;. FILE&lt;span class=&#34;token punctuation&#34;&gt;..&lt;/span&gt;.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;rm&lt;/code&gt;  的常用命令如下：&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;figcaption data-lang=&#34;bash&#34;&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;tr&gt;&lt;td data-num=&#34;1&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下的文件 file1.txt、file2.txt、file3.txt&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;2&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; file1.txt file2.txt file3.txt&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;3&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;4&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;5&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;6&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;7&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除你当前帐号主目录下的 temp 目录中的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;8&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; ~/temp/*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;9&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;10&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 使用 -i 选项，可以在删除每个文件或目录前提示用户确认&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;11&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-i&lt;/span&gt; *&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;12&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;13&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下所有以 &#34;.doc&#34; 结尾的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;14&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *.doc&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;15&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;16&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下所有文件名中包含 &#34;movie&#34; 字符串的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;17&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *movie*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;18&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;19&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下所有以 &#34;a&#34; 开头的文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;20&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; a*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;21&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;22&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下整个文件名（包括扩展名）只有 3 个字符的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;23&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; ???&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;24&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;25&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下文件扩展名有两个字符的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;26&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *.??&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;27&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;28&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下文件名中含有字母 a 或 b 或 c 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;29&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;abc&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;30&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;31&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下文件名中包含 0~9 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;32&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;-9&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;33&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;34&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除当前目录下文件扩展名是字母 c 或 h 的所有文件&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;35&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; *.&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;ch&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;36&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;37&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token comment&#34;&gt;# 删除 /tmp 目录下的所有文件及其子目录&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td data-num=&#34;38&#34;&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&lt;span class=&#34;token function&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;token parameter variable&#34;&gt;-rf&lt;/span&gt; /tmp/*&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;blockquote&gt;
&lt;p&gt;-f 删除前不提示用户确认，并忽略不存在的文件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;-r 递归地删除目录及其下的内容&lt;/p&gt;
&lt;/blockquote&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/f9c292b/</guid>
            <title>《软件工程之美》笔记</title>
            <link>https://metal-heart.github.io/posts/f9c292b/</link>
            <category term="软件" scheme="https://metal-heart.github.io/categories/Software/" />
            <category term="笔记" scheme="https://metal-heart.github.io/categories/Software/%E7%AC%94%E8%AE%B0/" />
            <category term="软件工程" scheme="https://metal-heart.github.io/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/" />
            <pubDate>Mon, 12 Jul 2021 13:20:31 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;软件工程之美笔记&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#软件工程之美笔记&#34;&gt;#&lt;/a&gt; 《软件工程之美》笔记&lt;/h1&gt;
&lt;h2 id=&#34;到底应该怎样理解软件工程&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#到底应该怎样理解软件工程&#34;&gt;#&lt;/a&gt; 到底应该怎样理解软件工程？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;软件产品危机&lt;/strong&gt;：软件产品质量低劣、软件维护工作量大、成本不断上升、进度不可控、程序人员无限度地增加。&lt;/p&gt;
&lt;p&gt;软件工程，它是为研究和克服软件危机而生。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件工程的本质&lt;/strong&gt;：用工程化方法去规范软件开发，让项目可以按时完成、成本可控、质量有保证。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件工程的核心&lt;/strong&gt;：是围绕软件项目开发，对开发过程的组织，对方法的运用，对工具的使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件工程 = 过程 + 方法 + 工具。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;工程思维把每件事都当作一个项目来推进&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#工程思维把每件事都当作一个项目来推进&#34;&gt;#&lt;/a&gt; 工程思维：把每件事都当作一个项目来推进&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;有目的、有计划、有步骤地解决问题的方法就是工程方法。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712132650.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;工程方法通常会分成六个阶段：想法、概念、计划、设计、开发和发布。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;** 想法：** 想法阶段通常是想要解决问题。最开始问题通常是模糊的，所以需要清晰地定义好问题，研究其可行性，检查是否有可行的解决方案。&lt;/li&gt;
&lt;li&gt;** 概念：** 概念阶段就是用图纸、草图、模型等方式，提出一些概念性的解决方案。这些方案可能有多个，最终会确定一个解决方案。&lt;/li&gt;
&lt;li&gt;** 计划：** 计划阶段是关于如何实施的计划，通常会包含人员、任务、任务持续时间、任务的依赖关系，以及完成项目所需要的预算。&lt;/li&gt;
&lt;li&gt;** 设计：** 设计阶段就是要针对产品需求，将解决方案进一步细化，设计整体架构和划分功能模块，作为分工合作和开发实施的一个依据和参考。&lt;/li&gt;
&lt;li&gt;** 开发：** 开发阶段就是根据设计方案，将解决方案构建实施。开发阶段通常是一个迭代的过程，这个阶段通常会有构建、测试、调试和重新设计的迭代。&lt;/li&gt;
&lt;li&gt;** 发布：** 将最终结果包括文档发布。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;瀑布模型像工厂流水线一样把软件开发分层化&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#瀑布模型像工厂流水线一样把软件开发分层化&#34;&gt;#&lt;/a&gt; 瀑布模型：像工厂流水线一样把软件开发分层化&lt;/h2&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712133102.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;瀑布模型把整个项目过程分成了六个主要阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题的定义及规划&lt;/strong&gt;：这个阶段是需求方和开发方共同确定软件开发目标，同时还要做可行性研究，以确定项目可行。这个阶段会产生需求文档和可行性研究报告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需求分析&lt;/strong&gt;：对需求方提出的所有需求，进行详细的分析。这个阶段一般需要和客户反复确认，以保证能充分理解客户需求。最终会形成需求分析文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件设计&lt;/strong&gt;：根据需求分析的结果，对整个软件系统进行抽象和设计，如系统框架设计，数据库设计等等。最后会形成架构设计文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序编码&lt;/strong&gt;：将架构设计和界面设计的结果转换成计算机能运行的程序代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件测试&lt;/strong&gt;：在编码完成后，对可运行的结果对照需求分析文档进行严密的测试。如果测试发现问题，需要修复。最终测试完成后，形成测试报告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行维护&lt;/strong&gt;：在软件开发完成，正式运行投入使用。后续需要继续维护，修复错误和增加功能。交付时需要提供使用说明文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712133357.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;瀑布模型之外还有哪些开发模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#瀑布模型之外还有哪些开发模型&#34;&gt;#&lt;/a&gt; 瀑布模型之外，还有哪些开发模型？&lt;/h2&gt;
&lt;h3 id=&#34;快速原型模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#快速原型模型&#34;&gt;#&lt;/a&gt; 快速原型模型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;快速原型模型，就是为了要解决客户的需求不明确和需求多变的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先迅速建造一个可以运行的软件原型，然后收集用户反馈，再反复修改确认，使开发出的软件能真正反映用户需求，这种开发模型就叫快速原型模型，也叫原型模型。&lt;/p&gt;
&lt;p&gt;原型模型因为能快速修改，所以能快速对用户的反馈和变更作出响应，同时原型模型注重和客户的沟通，所以最终开发出来的软件能够真正反映用户的需求。&lt;/p&gt;
&lt;p&gt;但这种快速原型开发往往是以牺牲质量为代价的。&lt;/p&gt;
&lt;h3 id=&#34;增量模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#增量模型&#34;&gt;#&lt;/a&gt; 增量模型&lt;/h3&gt;
&lt;p&gt;增量模型是把待开发的软件系统模块化，然后在每个小模块的开发过程中，应用一个小瀑布模型，对这个模块进行需求分析、设计、编码和测试。相对瀑布模型而言，增量模型周期更短，不需要一次性把整个软件产品交付给客户，而是分批次交付。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134154.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;因为增量模型的根基是模块化，所以，** 如果系统不能模块化，那么将很难采用增量模型的模式来开发。** 另外，对模块的划分很抽象，这本身对于系统架构的水平是要求很高的。&lt;/p&gt;
&lt;p&gt;基于这样的特点，增量模型主要适用于：&lt;strong&gt;需求比较清楚，能模块化的软件系统，并且可以按模块分批次交付。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;迭代模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#迭代模型&#34;&gt;#&lt;/a&gt; 迭代模型&lt;/h3&gt;
&lt;p&gt;迭代模型每次只设计和实现产品的一部分，然后逐步完成更多功能。每次设计和实现一个阶段叫做一个迭代。&lt;/p&gt;
&lt;p&gt;在迭代模型中，整个项目被拆分成一系列小的迭代。通常一个迭代的时间都是固定的，不会太长，例如 2-4 周。每次迭代只实现一部分功能，做能在这个周期内完成的功能。&lt;/p&gt;
&lt;p&gt;在一个迭代中都会包括需求分析、设计、实现和测试，类似于一个小瀑布模型。&lt;strong&gt;迭代结束时要完成一个可以运行的交付版本。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134329.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;增量模型是按照功能模块来拆分；而迭代模型则是按照时间来拆分，看单位时间内能完成多少功能。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;v-模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#v-模型&#34;&gt;#&lt;/a&gt; V 模型&lt;/h3&gt;
&lt;p&gt;V 模型适合外包项目。V 模型本质上还是瀑布模型，只不过它是更重视对每个阶段验收测试的过程模型。&lt;/p&gt;
&lt;p&gt;针对从需求定义一直到编码阶段，每个阶段都有对应的测试验收。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134518.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;螺旋模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#螺旋模型&#34;&gt;#&lt;/a&gt; 螺旋模型&lt;/h3&gt;
&lt;p&gt;如果你现在要做一个风险很高的项目，客户可能随时不给你钱了。这种情况下，如果采用传统瀑布模型，无疑风险很高，可能做完的时候才发现客户给不了钱，损失就很大了！&lt;/p&gt;
&lt;p&gt;这种情况，基于增量模型或者迭代模型进行开发，就可以有效降低风险。你需要注意的是，在每次交付的时候，要同时做一个风险评估，如果风险过大就不继续后续开发了，及时止损。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134638.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这种强调风险，以风险驱动的方式完善项目的开发模型就是螺旋模型。&lt;/p&gt;
&lt;h2 id=&#34;敏捷开发到底是想解决什么问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#敏捷开发到底是想解决什么问题&#34;&gt;#&lt;/a&gt; 敏捷开发到底是想解决什么问题？&lt;/h2&gt;
&lt;p&gt;敏捷开发是一套价值观和原则。&lt;/p&gt;
&lt;p&gt;瀑布模型面向的是过程，而敏捷开发面向的是人。&lt;/p&gt;
&lt;h2 id=&#34;大厂都在用哪些敏捷方法上&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大厂都在用哪些敏捷方法上&#34;&gt;#&lt;/a&gt; 大厂都在用哪些敏捷方法？（上）&lt;/h2&gt;
&lt;h3 id=&#34;一切工作任务围绕-ticket-开展&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#一切工作任务围绕-ticket-开展&#34;&gt;#&lt;/a&gt; 一切工作任务围绕 Ticket 开展&lt;/h3&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712135814.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每一个任务的状态都可以被跟踪起来：什么时候开始做的，谁在做，做完没有。&lt;/li&gt;
&lt;li&gt;整个团队在做什么一目了然。&lt;/li&gt;
&lt;li&gt;Ticket 和敏捷开发中的 Backlog（任务清单）正好结合起来，通过 Ticket 可以收集管理整个项目的 Backlog 和当前 Sprint（迭代）的 Backlog。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;基于-git-和-ci-的开发流程&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#基于-git-和-ci-的开发流程&#34;&gt;#&lt;/a&gt; 基于 Git 和 CI 的开发流程&lt;/h3&gt;
&lt;p&gt;Git 本来只是源代码管理工具，但是其强大的分支管理和灵活的权限控制，结合一定的开发流程，却可以帮助你很好的控制代码质量。&lt;/p&gt;
&lt;h3 id=&#34;站立会议&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#站立会议&#34;&gt;#&lt;/a&gt; 站立会议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每个人轮流介绍一下，昨天干了什么事情，今天计划做什么事情，工作上有没有障碍无法推进。有问题，记录到 “问题停车场”。&lt;/li&gt;
&lt;li&gt;检查最近的 Ticket，甄别一下优先级。有需要讨论的先收集到问题停车场。&lt;/li&gt;
&lt;li&gt;针对未讨论的问题展开讨论，能在会议时间内解决的问题，就马上解决，不能解决的会后再私下讨论或者再组织会议。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;大厂都在用哪些敏捷方法下&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大厂都在用哪些敏捷方法下&#34;&gt;#&lt;/a&gt; 大厂都在用哪些敏捷方法？（下）&lt;/h2&gt;
&lt;p&gt;在分工上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;产品经理：写需求设计文档，将需求整理成 Ticket，随时和项目成员沟通确认需求；&lt;/li&gt;
&lt;li&gt;开发人员：每天从看板上按照优先级从高到低领取 Ticket，完成日常开发任务；&lt;/li&gt;
&lt;li&gt;测试人员：测试已经部署到测试环境的程序，如果发现 Bug，提交 Ticket；&lt;/li&gt;
&lt;li&gt;项目经理：保障日常工作流程正常执行，让团队成员可以专注工作，提供必要的帮助，解决问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如何完成需求和修复 Bug？&lt;/p&gt;
&lt;p&gt;日常工作，是围绕 Ticket 来开展的。所有的需求、Bug、任务都作为 Ticket 提交到项目的 Backlog，每个 Sprint 的任务都以看板的形式展现出来。&lt;/p&gt;
&lt;p&gt;每个人手头事情忙完后，就可以去看板上的 “To Do” 栏，按照优先级从高到低选取新的 Ticket。选取后移动到 “In Progress” 栏。&lt;/p&gt;
&lt;p&gt;每周一部署生产环境&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#参考资料&#34;&gt;#&lt;/a&gt; 参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly90aW1lLmdlZWtiYW5nLm9yZy9jb2x1bW4vaW50cm8vMTAwMDIzNzAx&#34;&gt;软件工程之美&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/34066/</guid>
            <title>《软件工程》笔记</title>
            <link>https://metal-heart.github.io/posts/34066/</link>
            <category term="软件" scheme="https://metal-heart.github.io/categories/Software/" />
            <category term="笔记" scheme="https://metal-heart.github.io/categories/Software/%E7%AC%94%E8%AE%B0/" />
            <category term="软件工程" scheme="https://metal-heart.github.io/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/" />
            <category term="笔记" scheme="https://metal-heart.github.io/tags/%E7%AC%94%E8%AE%B0/" />
            <pubDate>Mon, 12 Jul 2021 13:20:31 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;软件工程之美笔记&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#软件工程之美笔记&#34;&gt;#&lt;/a&gt; 《软件工程之美》笔记&lt;/h1&gt;
&lt;h2 id=&#34;到底应该怎样理解软件工程&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#到底应该怎样理解软件工程&#34;&gt;#&lt;/a&gt; 到底应该怎样理解软件工程？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;软件产品危机&lt;/strong&gt;：软件产品质量低劣、软件维护工作量大、成本不断上升、进度不可控、程序人员无限度地增加。&lt;/p&gt;
&lt;p&gt;软件工程，它是为研究和克服软件危机而生。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件工程的本质&lt;/strong&gt;：用工程化方法去规范软件开发，让项目可以按时完成、成本可控、质量有保证。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件工程的核心&lt;/strong&gt;：是围绕软件项目开发，对开发过程的组织，对方法的运用，对工具的使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件工程 = 过程 + 方法 + 工具。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;工程思维把每件事都当作一个项目来推进&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#工程思维把每件事都当作一个项目来推进&#34;&gt;#&lt;/a&gt; 工程思维：把每件事都当作一个项目来推进&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;有目的、有计划、有步骤地解决问题的方法就是工程方法。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712132650.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;工程方法通常会分成六个阶段：想法、概念、计划、设计、开发和发布。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;** 想法：** 想法阶段通常是想要解决问题。最开始问题通常是模糊的，所以需要清晰地定义好问题，研究其可行性，检查是否有可行的解决方案。&lt;/li&gt;
&lt;li&gt;** 概念：** 概念阶段就是用图纸、草图、模型等方式，提出一些概念性的解决方案。这些方案可能有多个，最终会确定一个解决方案。&lt;/li&gt;
&lt;li&gt;** 计划：** 计划阶段是关于如何实施的计划，通常会包含人员、任务、任务持续时间、任务的依赖关系，以及完成项目所需要的预算。&lt;/li&gt;
&lt;li&gt;** 设计：** 设计阶段就是要针对产品需求，将解决方案进一步细化，设计整体架构和划分功能模块，作为分工合作和开发实施的一个依据和参考。&lt;/li&gt;
&lt;li&gt;** 开发：** 开发阶段就是根据设计方案，将解决方案构建实施。开发阶段通常是一个迭代的过程，这个阶段通常会有构建、测试、调试和重新设计的迭代。&lt;/li&gt;
&lt;li&gt;** 发布：** 将最终结果包括文档发布。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;瀑布模型像工厂流水线一样把软件开发分层化&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#瀑布模型像工厂流水线一样把软件开发分层化&#34;&gt;#&lt;/a&gt; 瀑布模型：像工厂流水线一样把软件开发分层化&lt;/h2&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712133102.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;瀑布模型把整个项目过程分成了六个主要阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题的定义及规划&lt;/strong&gt;：这个阶段是需求方和开发方共同确定软件开发目标，同时还要做可行性研究，以确定项目可行。这个阶段会产生需求文档和可行性研究报告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需求分析&lt;/strong&gt;：对需求方提出的所有需求，进行详细的分析。这个阶段一般需要和客户反复确认，以保证能充分理解客户需求。最终会形成需求分析文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件设计&lt;/strong&gt;：根据需求分析的结果，对整个软件系统进行抽象和设计，如系统框架设计，数据库设计等等。最后会形成架构设计文档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序编码&lt;/strong&gt;：将架构设计和界面设计的结果转换成计算机能运行的程序代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件测试&lt;/strong&gt;：在编码完成后，对可运行的结果对照需求分析文档进行严密的测试。如果测试发现问题，需要修复。最终测试完成后，形成测试报告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行维护&lt;/strong&gt;：在软件开发完成，正式运行投入使用。后续需要继续维护，修复错误和增加功能。交付时需要提供使用说明文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712133357.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;瀑布模型之外还有哪些开发模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#瀑布模型之外还有哪些开发模型&#34;&gt;#&lt;/a&gt; 瀑布模型之外，还有哪些开发模型？&lt;/h2&gt;
&lt;h3 id=&#34;快速原型模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#快速原型模型&#34;&gt;#&lt;/a&gt; 快速原型模型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;快速原型模型，就是为了要解决客户的需求不明确和需求多变的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先迅速建造一个可以运行的软件原型，然后收集用户反馈，再反复修改确认，使开发出的软件能真正反映用户需求，这种开发模型就叫快速原型模型，也叫原型模型。&lt;/p&gt;
&lt;p&gt;原型模型因为能快速修改，所以能快速对用户的反馈和变更作出响应，同时原型模型注重和客户的沟通，所以最终开发出来的软件能够真正反映用户的需求。&lt;/p&gt;
&lt;p&gt;但这种快速原型开发往往是以牺牲质量为代价的。&lt;/p&gt;
&lt;h3 id=&#34;增量模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#增量模型&#34;&gt;#&lt;/a&gt; 增量模型&lt;/h3&gt;
&lt;p&gt;增量模型是把待开发的软件系统模块化，然后在每个小模块的开发过程中，应用一个小瀑布模型，对这个模块进行需求分析、设计、编码和测试。相对瀑布模型而言，增量模型周期更短，不需要一次性把整个软件产品交付给客户，而是分批次交付。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134154.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;因为增量模型的根基是模块化，所以，** 如果系统不能模块化，那么将很难采用增量模型的模式来开发。** 另外，对模块的划分很抽象，这本身对于系统架构的水平是要求很高的。&lt;/p&gt;
&lt;p&gt;基于这样的特点，增量模型主要适用于：&lt;strong&gt;需求比较清楚，能模块化的软件系统，并且可以按模块分批次交付。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;迭代模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#迭代模型&#34;&gt;#&lt;/a&gt; 迭代模型&lt;/h3&gt;
&lt;p&gt;迭代模型每次只设计和实现产品的一部分，然后逐步完成更多功能。每次设计和实现一个阶段叫做一个迭代。&lt;/p&gt;
&lt;p&gt;在迭代模型中，整个项目被拆分成一系列小的迭代。通常一个迭代的时间都是固定的，不会太长，例如 2-4 周。每次迭代只实现一部分功能，做能在这个周期内完成的功能。&lt;/p&gt;
&lt;p&gt;在一个迭代中都会包括需求分析、设计、实现和测试，类似于一个小瀑布模型。&lt;strong&gt;迭代结束时要完成一个可以运行的交付版本。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134329.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;增量模型是按照功能模块来拆分；而迭代模型则是按照时间来拆分，看单位时间内能完成多少功能。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;v-模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#v-模型&#34;&gt;#&lt;/a&gt; V 模型&lt;/h3&gt;
&lt;p&gt;V 模型适合外包项目。V 模型本质上还是瀑布模型，只不过它是更重视对每个阶段验收测试的过程模型。&lt;/p&gt;
&lt;p&gt;针对从需求定义一直到编码阶段，每个阶段都有对应的测试验收。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134518.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;螺旋模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#螺旋模型&#34;&gt;#&lt;/a&gt; 螺旋模型&lt;/h3&gt;
&lt;p&gt;如果你现在要做一个风险很高的项目，客户可能随时不给你钱了。这种情况下，如果采用传统瀑布模型，无疑风险很高，可能做完的时候才发现客户给不了钱，损失就很大了！&lt;/p&gt;
&lt;p&gt;这种情况，基于增量模型或者迭代模型进行开发，就可以有效降低风险。你需要注意的是，在每次交付的时候，要同时做一个风险评估，如果风险过大就不继续后续开发了，及时止损。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712134638.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;这种强调风险，以风险驱动的方式完善项目的开发模型就是螺旋模型。&lt;/p&gt;
&lt;h2 id=&#34;敏捷开发到底是想解决什么问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#敏捷开发到底是想解决什么问题&#34;&gt;#&lt;/a&gt; 敏捷开发到底是想解决什么问题？&lt;/h2&gt;
&lt;p&gt;敏捷开发是一套价值观和原则。&lt;/p&gt;
&lt;p&gt;瀑布模型面向的是过程，而敏捷开发面向的是人。&lt;/p&gt;
&lt;h2 id=&#34;大厂都在用哪些敏捷方法上&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大厂都在用哪些敏捷方法上&#34;&gt;#&lt;/a&gt; 大厂都在用哪些敏捷方法？（上）&lt;/h2&gt;
&lt;h3 id=&#34;一切工作任务围绕-ticket-开展&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#一切工作任务围绕-ticket-开展&#34;&gt;#&lt;/a&gt; 一切工作任务围绕 Ticket 开展&lt;/h3&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220712135814.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每一个任务的状态都可以被跟踪起来：什么时候开始做的，谁在做，做完没有。&lt;/li&gt;
&lt;li&gt;整个团队在做什么一目了然。&lt;/li&gt;
&lt;li&gt;Ticket 和敏捷开发中的 Backlog（任务清单）正好结合起来，通过 Ticket 可以收集管理整个项目的 Backlog 和当前 Sprint（迭代）的 Backlog。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;基于-git-和-ci-的开发流程&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#基于-git-和-ci-的开发流程&#34;&gt;#&lt;/a&gt; 基于 Git 和 CI 的开发流程&lt;/h3&gt;
&lt;p&gt;Git 本来只是源代码管理工具，但是其强大的分支管理和灵活的权限控制，结合一定的开发流程，却可以帮助你很好的控制代码质量。&lt;/p&gt;
&lt;h3 id=&#34;站立会议&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#站立会议&#34;&gt;#&lt;/a&gt; 站立会议&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每个人轮流介绍一下，昨天干了什么事情，今天计划做什么事情，工作上有没有障碍无法推进。有问题，记录到 “问题停车场”。&lt;/li&gt;
&lt;li&gt;检查最近的 Ticket，甄别一下优先级。有需要讨论的先收集到问题停车场。&lt;/li&gt;
&lt;li&gt;针对未讨论的问题展开讨论，能在会议时间内解决的问题，就马上解决，不能解决的会后再私下讨论或者再组织会议。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;大厂都在用哪些敏捷方法下&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#大厂都在用哪些敏捷方法下&#34;&gt;#&lt;/a&gt; 大厂都在用哪些敏捷方法？（下）&lt;/h2&gt;
&lt;p&gt;在分工上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;产品经理：写需求设计文档，将需求整理成 Ticket，随时和项目成员沟通确认需求；&lt;/li&gt;
&lt;li&gt;开发人员：每天从看板上按照优先级从高到低领取 Ticket，完成日常开发任务；&lt;/li&gt;
&lt;li&gt;测试人员：测试已经部署到测试环境的程序，如果发现 Bug，提交 Ticket；&lt;/li&gt;
&lt;li&gt;项目经理：保障日常工作流程正常执行，让团队成员可以专注工作，提供必要的帮助，解决问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如何完成需求和修复 Bug？&lt;/p&gt;
&lt;p&gt;日常工作，是围绕 Ticket 来开展的。所有的需求、Bug、任务都作为 Ticket 提交到项目的 Backlog，每个 Sprint 的任务都以看板的形式展现出来。&lt;/p&gt;
&lt;p&gt;每个人手头事情忙完后，就可以去看板上的 “To Do” 栏，按照优先级从高到低选取新的 Ticket。选取后移动到 “In Progress” 栏。&lt;/p&gt;
&lt;p&gt;每周一部署生产环境&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#参考资料&#34;&gt;#&lt;/a&gt; 参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;exturl&#34; data-url=&#34;aHR0cHM6Ly90aW1lLmdlZWtiYW5nLm9yZy9jb2x1bW4vaW50cm8vMTAwMDIzNzAx&#34;&gt;软件工程之美&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/62526/</guid>
            <title>《硬件设计经验谈》</title>
            <link>https://metal-heart.github.io/posts/62526/</link>
            <category term="硬件设计" scheme="https://metal-heart.github.io/categories/Hardware/" />
            <category term="硬件设计" scheme="https://metal-heart.github.io/tags/%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1/" />
            <pubDate>Sat, 10 Jul 2021 10:00:00 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;1充分了解各方的设计需求确定合适的解决方案&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1充分了解各方的设计需求确定合适的解决方案&#34;&gt;#&lt;/a&gt; 1. 充分了解各方的设计需求，确定合适的解决方案&lt;/h1&gt;
&lt;p&gt;启动一个硬件开发项目，原始的推动力会来自于很多方面，比如市场的需要，基于整个系统架构的需要，应用软件部门的功能实现需要，提高系统某方面能力的需要等等，所以作为一个硬件系统的设计者，要&lt;strong&gt;主动的去了解各个方面的需求，并且综合起来，提出最合适的硬件解决方案&lt;/strong&gt;。比如 A 项目的原始推动力来自于公司内部的一个高层软件小组，他们在实际当中发现原有的处理器板 IP 转发能力不能满足要求，从而对于系统的配置和使用都会造成很大的不便，所以他们提出了对新硬件的需求。根据这个目标，硬件方案中就针对性的选用了两个高性能网络处理器，然后还需要深入的和软件设计者交流，以确定内存大小，内部结构，对外接口和调试接口的数量及类型等等细节，比如软件人员喜欢将控制信令通路和数据通路完全分开来，这样在确定内部数据走向的时候要慎重考虑。项目开始之初是需要召开很多的讨论会议的，应该尽量邀请所有相关部门来参与，好处有三个，第一可以充分了解大家的需要，以免在系统设计上遗漏重要的功能，第二是可以让各个部门了解这个项目的情况，提早做好时间和人员上协作的准备，第三是从感情方面讲，在设计之初各个部门就参与了进来，这个项目就变成了大家共同的一个心血结晶，会得到大家的呵护和良好合作，对完成工作是很有帮助的。&lt;/p&gt;
&lt;h1 id=&#34;2原理图设计中要注意的问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2原理图设计中要注意的问题&#34;&gt;#&lt;/a&gt; 2. 原理图设计中要注意的问题&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;原理图设计中要有 “拿来主义”，现在的芯片厂家一般都可以提供参考设计的原理图，所以要尽量的借助这些资源，在充分理解参考设计的基础上，做一些自己的发挥&lt;/strong&gt;。当主要的芯片选定以后，最关键的外围设计包括了电源，时钟和芯片间的互连。&lt;/p&gt;
&lt;p&gt;电源是保证硬件系统正常工作的基础，设计中要详细的分析：&lt;strong&gt;系统能够提供的电源输入；单板需要产生的电源输出；各个电源需要提供的电流大小；电源电路效率；各个电源能够允许的波动范围；整个电源系统需要的上电顺序等等&lt;/strong&gt;。比如 A 项目中的网络处理器需要 1.25V 作为核心电压，要求精度在＋5%- －3% 之间，电流需要 12A 左右，根据这些要求，设计中采用 5V 的电源输入，利用 Linear 的开关电源控制器和 IR 的 MOSFET 搭建了合适的电源供应电路，精度要求决定了输出电容的 ESR 选择，并且为防止电流过大造成的电压跌落，加入了远端反馈的功能。&lt;br /&gt;
时钟电路的实现要考虑到目标电路的抖动等要求，A 项目中用到了 GE 的 PHY 器件，刚开始的时候使用一个内部带锁相环的零延时时钟分配芯片提供 100MHz 时钟，结果 GE 链路上出现了丢包，后来换成简单的时钟 Buffer 器件就解决了丢包问题，分析起来就是内部的锁相环引入了抖动。&lt;br /&gt;
芯片之间的互连要保证数据的无误传输，在这方面，高速的差分信号线具有速率高，好布线，信号完整性好等特点，A 项目中的多芯片间互连均采用了高速差分信号线，在调试和测试中没有出现问题。&lt;/p&gt;
&lt;h1 id=&#34;3pcb设计中要注意的问题&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3pcb设计中要注意的问题&#34;&gt;#&lt;/a&gt; 3.PCB 设计中要注意的问题&lt;/h1&gt;
&lt;p&gt;PCB 设计中要做到目的明确，对于重要的信号线要非常严格的要求布线的长度和处理地环路，而对于低速和不重要的信号线就可以放在稍低的布线优先级上。重要的部分包括：电源的分割；内存的时钟线，控制线和数据线的长度要求；高速差分线的布线等等。&lt;br /&gt;
针对 DDR memory 这个部分的布线是非常关键的，要考虑到控制线和地址线的拓扑分布，数据线和时钟线的长度差别控制等方面，在实现的过程中，根据芯片的数据手册和实际的工作频率可以得出具体的布线规则要求，比如同一组内的数据线长度相差不能超过多少个 mil，每个通路之间的长度相差不能超过多少个 mil 等等。当这些要求确定后就可以明确要求 PCB 设计人员来实现了，如果设计中所有的重要布线要求都明确了，可以转换成整体的布线约束，利用 CAD 中的自动布线工具软件来实现 PCB 设计，这也是在高速 PCB 设计中的一个发展趋势。&lt;/p&gt;
&lt;h1 id=&#34;4检查和调试&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4检查和调试&#34;&gt;#&lt;/a&gt; 4. 检查和调试&lt;/h1&gt;
&lt;p&gt;当准备调试一块板的时候，一定要先认真的做好目视检查，检查在焊接的过程中是否有可见的短路和管脚搭锡等故障，检查是否有元器件型号放置错误，第一脚放置错误，漏装配等问题，然后用万用表&lt;strong&gt;测量各个电源到地的电阻，以检查是否有短路&lt;/strong&gt;，这个好习惯可以避免贸然上电后损坏单板。调试的过程中要有平和的心态，遇见问题是非常正常的，要做的就是多做比较和分析，逐步的排除可能的原因，要坚信 “凡事都是有办法解决的” 和 “问题出现一定有它的原因”，这样最后一定能调试成功。&lt;/p&gt;
&lt;h1 id=&#34;5一些总结的话&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5一些总结的话&#34;&gt;#&lt;/a&gt; 5. 一些总结的话&lt;/h1&gt;
&lt;p&gt;现在从技术的角度来说，每个设计最终都可以做出来，但是一个项目的成功与否，不仅仅取决&lt;strong&gt;于技术上的实现，还与完成的时间，产品的质量，团队的配合密切相关，所以良好的团队协作，透明坦诚的项目沟通，精细周密的研发安排，充裕的物料和人员安排，这样才能保证一个项目的成功。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个好的硬件工程师实际上就是一个项目经理，他 / 她需要从外界交流获取对自己设计的需求，然后汇总，分析成具体的硬件实现。还要跟众多的芯片和方案供应商联系，从中挑选出合适的方案，当原理图完成后，他 / 她要组织同事来进行配合评审和检查，还要和 CAD 工程师一起工作来完成 PCB 的设计。与此同时，还要准备好 BOM 清单，开始采购和准备物料，联系加工厂家完成板的贴装。在调试的过程中他 / 她要组织好软件工程师来一起攻关调试，配合测试工程师一起解决测试中发现的问题，等到产品推出到现场，如果出现问题，还需要做到及时的支持。所以做一个硬件设计人员要锻炼出良好的沟通能力，面对压力的调节能力，同一时间处理多个事务的协调和决断能力和良好平和的心态等等。&lt;/p&gt;
&lt;p&gt;还有细心和认真，因为硬件设计上的一个小疏忽往往就会造成非常大的经济损失，比如以前碰到一块板在 PCB 设计完备出制造文件的时候误操作造成了电源层和地层连在了一起，PCB 板制造完毕后又没有检查直接上生产线贴装，到测试的时候才发现短路问题，但是元器件已经都焊接到板上了，结果造成了几十万的损失。所以细心和认真的检查，负责任的测试，不懈的学习和积累，才能使得一个硬件设计人员持续不断的进步，而后术业有所小成。&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://metal-heart.github.io/posts/59766/</guid>
            <title>《职场求生攻略》</title>
            <link>https://metal-heart.github.io/posts/59766/</link>
            <category term="工作" scheme="https://metal-heart.github.io/categories/work/" />
            <category term="职场" scheme="https://metal-heart.github.io/categories/work/Workplace/" />
            <category term="教程" scheme="https://metal-heart.github.io/tags/%E6%95%99%E7%A8%8B/" />
            <category term="工作" scheme="https://metal-heart.github.io/tags/%E5%B7%A5%E4%BD%9C/" />
            <pubDate>Sun, 13 Jun 2021 20:56:48 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;职场求生攻略笔记&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#职场求生攻略笔记&#34;&gt;#&lt;/a&gt; 《职场求生攻略》笔记&lt;/h1&gt;
&lt;h2 id=&#34;学会如何工作和学习技术同等重要&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#学会如何工作和学习技术同等重要&#34;&gt;#&lt;/a&gt; 学会如何工作，和学习技术同等重要&lt;/h2&gt;
&lt;div class=&#34;note info&#34;&gt;
&lt;p&gt;以利益为视角，以换位思考为手段。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&#34;优先级工作中那么多事情我要如何安排优先级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#优先级工作中那么多事情我要如何安排优先级&#34;&gt;#&lt;/a&gt; 优先级：工作中那么多事情，我要如何安排优先级？&lt;/h2&gt;
&lt;h3 id=&#34;基于工作性质安排优先级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#基于工作性质安排优先级&#34;&gt;#&lt;/a&gt; 基于工作性质安排优先级&lt;/h3&gt;
&lt;p&gt;工作可以划分为：&lt;/p&gt;
&lt;p&gt;业务拓展：需求分析、设计、开发都属于这范畴。&lt;/p&gt;
&lt;p&gt;安全问题：安全无小事。要高度重视安全问题。&lt;/p&gt;
&lt;p&gt;线上问题：直接影响用户体验和权益。要第一优先级去处理。&lt;/p&gt;
&lt;h3 id=&#34;基于合作安排优先级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#基于合作安排优先级&#34;&gt;#&lt;/a&gt; 基于合作安排优先级&lt;/h3&gt;
&lt;p&gt;事情如果没有明显的轻重缓急，优先做那些会阻塞别人工作的事情。&lt;/p&gt;
&lt;h3 id=&#34;做事情本身的优先级&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#做事情本身的优先级&#34;&gt;#&lt;/a&gt; 做事情本身的优先级&lt;/h3&gt;
&lt;p&gt;我们做事情的时候，如果能把其中的每一步都想清楚，理清依赖关系，安排得井井有条，这就已经事半功倍了。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220711065205.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;沟通邮件那么重要你还在轻视邮件吗&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#沟通邮件那么重要你还在轻视邮件吗&#34;&gt;#&lt;/a&gt; 沟通：邮件那么重要，你还在轻视邮件吗？&lt;/h2&gt;
&lt;h3 id=&#34;邮件的特性&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#邮件的特性&#34;&gt;#&lt;/a&gt; 邮件的特性&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;异步交流：邮件是一种异步交流的方式，双方有足够的时间准备邮件内容。&lt;/li&gt;
&lt;li&gt;无法修改：邮件内容无法修改，这是邮件可靠的基石。&lt;/li&gt;
&lt;li&gt;方便扩散：邮件有邮件组，可以很方便地把相关人员加进来，并且保留邮件历史记录。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;邮件是公司内部的合同&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#邮件是公司内部的合同&#34;&gt;#&lt;/a&gt; 邮件是公司内部的合同&lt;/h3&gt;
&lt;p&gt;场景 1：设计确认（邮件的 “确认” 功能）&lt;/p&gt;
&lt;p&gt;场景 2：优先级（邮件的 “证据链” 功能）&lt;/p&gt;
&lt;p&gt;场景 3：大促（邮件的 “沟通协调” 功能）&lt;/p&gt;
&lt;p&gt;场景 4：新业务接入（邮件的 “防遗忘” 功能）&lt;/p&gt;
&lt;p&gt;场景 5：技术升级和 Bug 修复（邮件的 “广而告之” 功能）&lt;/p&gt;
&lt;h3 id=&#34;邮件的魅力&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#邮件的魅力&#34;&gt;#&lt;/a&gt; 邮件的魅力&lt;/h3&gt;
&lt;p&gt;我们都是普通人，普通人没有 “背锅” 的压力，就没有持久的把事情做好的动力。&lt;/p&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220711065742.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;沟通程序员为什么应该爱上交流&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#沟通程序员为什么应该爱上交流&#34;&gt;#&lt;/a&gt; 沟通：程序员为什么应该爱上交流？&lt;/h2&gt;
&lt;h3 id=&#34;&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#&#34;&gt;#&lt;/a&gt; &lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220711070152.png&#34; alt=&#34;&#34; /&gt;&lt;/h3&gt;
&lt;h2 id=&#34;主观能动性为什么程序员需要发挥主观能动性&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#主观能动性为什么程序员需要发挥主观能动性&#34;&gt;#&lt;/a&gt; 主观能动性：为什么程序员，需要发挥主观能动性？&lt;/h2&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220711070531.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;责任的边界程序员的职责范围仅仅只是被安排的任务吗&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#责任的边界程序员的职责范围仅仅只是被安排的任务吗&#34;&gt;#&lt;/a&gt; 责任的边界：程序员的职责范围仅仅只是被安排的任务吗？&lt;/h2&gt;
&lt;p&gt;&lt;img data-src=&#34;https://raw.githubusercontent.com/dunwu/images/dev/snap/20220711070722.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
 ]]></description>
        </item>
    </channel>
</rss>
