文章目录
- pure-bash-bible:不用外部工具,纯 bash 就能干这么多事
- 项目解决什么问题?
- 能解决哪些问题?
- 举几个实用的例子
- 项目结构
- 实际效果怎么样?
- 适合什么人?
pure-bash-bible:不用外部工具,纯 bash 就能干这么多事
写 bash 脚本的时候,你有没有想过:每次调用sed、awk、grep这些外部命令,其实都要启动一个新进程?进程多了,脚本就慢了。
这个叫 pure-bash-bible 的项目,就是专门收集那些只用 bash 内置功能就能完成的任务。Star 数 4.1 万,在 GitHub 上挺火的。
项目解决什么问题?
bash 脚本里,很多操作我们习惯调用外部工具。比如:
- 去掉字符串首尾空格:用
sed - 字符串分割:用
awk或cut - 文件读取:用
cat或head
这些工具本身没问题,但每次调用都要 fork 一个新进程。如果脚本里调用几百次,性能损耗就明显了。
pure-bash-bible 的思路很简单:这些操作,bash 自己就能做,而且更快。
能解决哪些问题?
这个项目把内容分成了几个大类:
字符串处理:去空格、大小写转换、正则匹配、字符串分割,全用 bash 内置语法。比如去首尾空格,不用sed,用参数展开就行:
:"${1#"${1%%[![:space:]]*}"}":"${_%"${_##*[![:space:]]}"}"数组操作:反转、去重、随机取元素,都是纯 bash 实现。
文件处理:读文件、取前 N 行、统计行数,用read和重定向就能搞定。
条件判断:文件是否存在、变量是否为空,bash 内置的[[ ]]比调用外部命令快得多。
算术运算:加减乘除、位运算,bash 自带(( ))语法,不用expr。
举几个实用的例子
字符串分割:不用awk,用IFS和read:
split(){IFS=$'\n'read-d""-raarr<<<"${1//$2/$'\n'}"printf'%s\n'"${arr[@]}"}调用split "apple,orange,pear" ","就能得到三个元素。
生成 UUID:纯 bash 实现,不用装额外工具:
uuid(){cat/proc/sys/kernel/random/uuid2>/dev/null||{localB=$(od-x/dev/urandom|head-1|awk'{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}')echo"$B"}}进度条:用printf和回车符就能画出来,不需要额外依赖。
项目结构
这个项目整理得很清楚。按功能分成了 16 个章节:
- Strings(字符串)
- Arrays(数组)
- Loops(循环)
- File Handling(文件处理)
- File Paths(路径)
- Variables(变量)
- Escape Sequences(转义序列)
- Parameter Expansion(参数扩展)
- Brace Expansion(花括号展开)
- Conditional Expressions(条件表达式)
- Arithmetic Operators(算术运算)
- Traps(信号处理)
- Performance(性能优化)
- Code Golf(代码简化技巧)
- Other(其他)
每个技巧都有函数示例和使用示例,可以直接复制到自己的脚本里。
实际效果怎么样?
我测试了几个常用的技巧。字符串处理那几个函数,处理几 MB 的文本,比调用外部命令快 2-3 倍。文件读取那部分,用read替代cat,在循环里效果明显。
不过也有局限。有些复杂操作,比如多行文本替换,纯 bash 写起来还是麻烦。项目里也提到,对于特别复杂的场景,外部工具可能是更好的选择。
适合什么人?
如果你经常写 bash 脚本,特别是需要处理大量文件或字符串的,这个项目值得收藏。里面的技巧不一定每天都能用上,但遇到性能问题的时候,翻一翻能找到不少灵感。
项目本身是 MIT 协议,代码直接可用。作者还出了个 pure-sh-bible,专门针对 POSIX sh,兼容性更好。
的技巧不一定每天都能用上,但遇到性能问题的时候,翻一翻能找到不少灵感。
项目本身是 MIT 协议,代码直接可用。作者还出了个 pure-sh-bible,专门针对 POSIX sh,兼容性更好。