一 Linux Shell 字符模式下汉诺塔的UI实现
【动机】
汉诺塔问题家喻户晓,是递归函数的简单应用,大部分的实现都是强调算法,表示盘子的移动几乎都是用的 A->B B-C 之类的符号来表示盘子的移动过程。如何在 linux shell 字符界面形象的演示盘子的移动呢?

十四 使用 shc 编译 linux shell 脚本为可执行文件
【动机】
shc
(Shell Compiler)是一个工具,用于将shell脚本编译成二进制执行文件,这样可以防止源代码泄露,并提高脚本的执行效率. 假设存在两个文件, 结构是:

十三 文件瘦身-去除 linux shell 脚本注释
【动机】
常见的需求是为了减小脚本体积而去除脚本注释, 近日发现对于一些复杂的脚本, 使用 shc 工具编译脚本为可执行文件, 在去除注释前编译失败, 去除注释后能顺利编译. 如何分离瘦身脚本, 以便可用于任何 linux shell 脚本?

十二 bash 的简单面向对象编程
【动机】
众所周知, linux shell 编程, 非面向对象, 故以下代码无法运行:

十一 动态函数的科学实现
【动机】
还记得在日志记录和动态函数一篇中, 曾经提到的动态实现? 基本思路是, 先建立动态日志函数的”根”函数 logx, 再在 command_not_found_handle 函数中, 将不存在的日志函数, 例如 logx_ok, 剥离出 ok 作为参数, 重定向到 logx 处理. 这样的方案看上去挺优雅, 但是至少存在以下缺点:

十 任务和进度展示的封装
【动机】
从上篇综合进度条中可以看到, 如果每次运行任务(命令或函数), 都需要进行逐个进度条, 变换符号, 耗时函数的调用, 然后再运行任务, 则不可谓不繁. 如何解决?

八 改进的菜单(二)
【动机】
上一篇改进的菜单(一), 主要存在的问题是, 如果菜单项和(或)值包含单引号, 得到的结果可能不是预期. 本篇尝试解决.

七 改进的菜单(一)
【动机】
上一篇的简易菜单, 至少存在以下两个明显缺点:
- 即使行分隔符和列分隔符均采用默认, 调用 kid_menu / kid_assign 时, 仍然需要键入分隔符, 比较繁琐;
- 调用代码的视觉(所见即所得)较差.

八 再论函数的命名参数设计
【动机】
在函数的命名参数设计篇中, 我们看到命名参数的获取和设置上的一些限制. 在本文中, 将其一次性解决.

九 综合进度条
【动机】
经常在线安装软件包的朋友, 一定对下载/安装时的进度条印象深刻. 本节起, 一共使用四节的篇幅, 与大家分享几种进度条的制作与使用.

五 日志记录和动态函数
【动机】
linux shell 脚本常见的调试手法如下:
- 将命令直接粘贴到控制台
- echo / printf 数值
- 断点调试, 例如 vscode 配合使用 Bash Debug 等调试插件

四 花式清屏
【动机】
众所周知, 清屏采用 clear 命令即可. 只不过有时为了做一些后台进程加载, 或者纯粹为了提升一些用户体验, 可能需要将清屏的过程做一些修饰.

三 控制台的对齐输出
【动机】
我们在执行大量 linux shell 脚本或命令时, 常常少不了超前打印一些提示或表示正在执行之类的文本, 为避免单调, 有时候需要将文本做一些右对齐或居中显示, 而如果不指定位置, echo / printf 默认只是在当前位置顺序打印.

二 字符的控制台占宽
【动机】
在一些字符串的控制台对齐(例如居中对齐, 右对齐)输出的场景, 先决条件是计算其中每个字符的占宽(即在控制台中占几列), 以及控制台的总列数, 后者可以通过 tput cols 得到, 前者如果按 ${#str} 简单处理:

六 脚本的批量 source
【动机】
当入口 linux shell 脚本 main.sh, 在需要包含其他脚本的变量设置, 或者向当前会话添加其他脚本定义的函数等场景, 假设要 source 的文件分两部分, 分别位于项目文件夹以及公共的库文件夹下,一般采取以下形式(本文仅讨论不带参数的 source 语句):

五 bash选项的保存修改和还原
【动机】
众所周知, bash 选项 errexit(默认为 off) 如果被设置为 on, 意味着只要主进程中任何一个函数(或命令)调用的退出码 (exitcode) 非0, 程序马上退出, 这对提高编码的健壮性的作用不言而喻.

三 函数的命名参数设计
【动机】
众所周知, linux shell 函数的定义, 默认采用位置参数, 在函数内部, 以 $1 $2 $3… 获取. 这对于一两个参数的函数, 还不觉得有何不便之处, 当参数个数多了以后, 不论是函数的编写还是调用或者扩展, 可能就不太好玩了.

四 bash选项的获取和设置
【动机】
众所周知,bash 选项分两部分, 分别归 shopt 和 shopt -o 管理, 而后者等同于 set -o.
以 errexit 和 autocd 为例, 使用命令行返回的字符串获取:

一 函数调用时, 局部变量的”穿透”
本文讨论 linux shell 脚本函数中, 使用 local 定义的变量的 “穿透性”

八 改进的菜单(二)
【动机】
上一篇改进的菜单(一), 主要存在的问题是, 如果菜单项和(或)值包含单引号, 得到的结果可能不是预期. 本篇尝试解决.
七 改进的菜单(一)
【动机】
上一篇的简易菜单, 至少存在以下两个明显缺点:
- 即使行分隔符和列分隔符均采用默认, 调用 kid_menu / kid_assign 时, 仍然需要键入分隔符, 比较繁琐;
- 调用代码的视觉(所见即所得)较差.
五 日志记录和动态函数
【动机】
linux shell 脚本常见的调试手法如下:
- 将命令直接粘贴到控制台
- echo / printf 数值
- 断点调试, 例如 vscode 配合使用 Bash Debug 等调试插件
四 花式清屏
【动机】
众所周知, 清屏采用 clear 命令即可. 只不过有时为了做一些后台进程加载, 或者纯粹为了提升一些用户体验, 可能需要将清屏的过程做一些修饰.
三 控制台的对齐输出
【动机】
我们在执行大量 linux shell 脚本或命令时, 常常少不了超前打印一些提示或表示正在执行之类的文本, 为避免单调, 有时候需要将文本做一些右对齐或居中显示, 而如果不指定位置, echo / printf 默认只是在当前位置顺序打印.
二 字符的控制台占宽
【动机】
在一些字符串的控制台对齐(例如居中对齐, 右对齐)输出的场景, 先决条件是计算其中每个字符的占宽(即在控制台中占几列), 以及控制台的总列数, 后者可以通过 tput cols 得到, 前者如果按 ${#str} 简单处理: