一个好的帮助信息对于快速、高效的使用shell脚本是非常有好处的。我们一般通过echo来逐行打印帮助信息,这种方式一个明显的缺点就是需要手动去进行排版,而排版的过程有时十分的繁琐。有没有想过,如果可以像写一般的注释一样来完成帮助信息的编写,那该多好啊!本文通过sed这个工具来实现,像写注释一样写shell的帮助信息。
shell中一般#开头的行为注释信息,所以利用这个特性,我们可以把帮助信息设计成如下的样式:
#!/usr/bin/env bash ### ### my-script — does one thing well ### ### Usage: ### my-script <input> <output> ### ### Options: ### <input> Input file to read. ### <output> Output file to write. Use '-' for stdout. ### -h Show this message.
然后,编写一个help函数完成帮助信息打印。
help() { sed -rn 's/^### ?//;T;p;' "$0" }
这里用到了sed这个工具,sed是类Unix系统中十分强大的流编辑工具,关于sed的更多的使用方式,请man sed。关于help中的sed使用到的参数解释如下:
- "$0":表示脚本的文件名,例如,help.sh
- -r:表示使用扩展的正则表达式
- -n:表示打印sed匹配到的信息
- s:使用sed的替换模式
- ^### ?:表示匹配以###和若干个空格开头的字符串
- //:用空字符替换之前匹配到的字符串
- T:如果s///没有替换成功,跳转到sed-script的末尾
- p:打印替换结果
编写help的调用逻辑,即直接调用脚本,或者使用-h选项。
if [[ $# == 0 ]] || [[ "$1" == "-h" ]]; then help exit 1 fi
使用效果:
$ ./help.sh my-script — does one thing well Usage: my-script <input> <output> Options: <input> Input file to read. <output> Output file to write. Use '-' for stdout. -h Show this message.