BASH 脚本,即使你不是程序员也少不了会使用、 会编写——因为它真的很强大,而且无处不在,在可见的将来也不会消失。作为程序员,也许 你觉得 BASH 脚本太难写,BASH 语法太难看,BASH 脚本不安全,但是也许 BASH 不会变成 主流编程语言,它总是那么易得,仿佛就在手边,每个 GNU/Linux 发行版都有它,甚至连 Docker 也要带着它,如果你不会编写 BASH 脚本,那么你可能就错失了最直接、最自然、 最简单的解决方案,简直是入宝山而空返。

BASH 是 shell(命令解释器)的一种,而命令解释器是 UNIX 最前卫、最强大的思想之一。 使用 BASH 可以快速把一系列命令和工具组合起来完成复杂任务,这些脚本还可以保存起来 对付以后的类似任务。

管道|是命令解释器的另一个利器。利用管道,BASH 可以简明地构建多个命令之间的输入 输出逻辑关系,并强有力地按照程序员的想法执行出结果。这种能力是其他编程语言难以企 及的。

下面看两个例子。

  1. 列出最近有变化的 5 个目录
ls -tc | head -n5 | tr '\n' '\0' | xargs -0 ls

说明:

  • ls -tc: 按状态改变时间列出目录。

  • head -n5: 列出前五个。

  • `tr ‘\n’ ‘\0’: 把换行符替换未字符串结尾。

  • xargs -0 ls: 列出筛选以出来的字符串为目录名的内容。

当然,最后的命令ls可以根据需要调整成其他命令,非常实用。

  1. 列出历史中曾经使用过的复杂命令
history | cut -d' ' -f3- | awk -F'|' '{ print NF-1 " " $0 }' | sort -n | tail

说明:

  • history: 列出历史命令。

  • cut -d' ' -f3-: 移除历史命令的第三列(以空格分割),就是把历史命令的编号去掉。

  • awk -F'|' '{ print NF-1 " " $0 }': 使用awk打印命令里的|个数。

  • sort -n: 按数字大小排列结果。

  • tail:列出最后十个结果。

这个大家可以试一试,其中-f3-可能需要根据自己的终端设置调整。

希望这两个小例子给予大家一些想象的空间——BASH 实际带来的便利会非常大。或早或晚, 作为程序员,你都需要学习 BASH 编程。

下面是两个小练习,大家看看是什么结果?

  • seq 1 10

  • tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1

预祝大家 2021 年元旦快乐!