shell 脚本编写的技巧


打印脚本帮助文档,获取参数

getopts

用法肯定是很多的,这里就说一个最常用的、简单的命令

$ cat threeOptions.sh
#!/bin/bash

while getopts ":A:B:C:" opt; do
  case $opt in
   A) echo "The argument for the option A is $OPTARG" ;;
   B) echo "The argument for the option B is $OPTARG" ;;
   C) echo "The argument for the option C is $OPTARG" ;;
   ?) echo "Unknown Option" 
      exit 1 ;;
  esac
done
shift "$(($OPTIND -1))"
# In the script threeOptions.sh, we’ve used getopts to parse options and their arguments.

$ echo "Tom Likes Jerry" | xargs bash -c './threeOptions.sh -A $2 -B $1 -C $0'
The argument for the option A is Jerry
The argument for the option B is Likes
The argument for the option C is Tom

自定义 help 函数

参考: shell脚本如何优雅的打印帮助信息
shell中一般#开头的行为注释信息,所以利用这个特性,我们可以把帮助信息设计成如下的样式:

#!/usr/bin/env bash 
### 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"
}

编写help的调用逻辑,即直接调用脚本,或者使用-h选项:

if [[ $# == 0 ]] || [[ "$1" == "-h" ]]; then
	    help
	    exit 1
fi

这里用到了sed这个工具,sed是类Unix系统中十分强大的流编辑工具,关于sed的更多的使用方式,请man sed。关于help中的sed使用到的参数解释如下:

  • “$0”:表示脚本的文件名,例如,help.sh
  • -r:表示使用扩展的正则表达式
  • -n:表示打印sed匹配到的信息
  • s:使用sed的替换模式
  • ^### ?:表示匹配以###和若干个空格开头的字符串
  • //:用空字符替换之前匹配到的字符串
  • T:如果s///没有替换成功,跳转到sed-script的末尾
  • p:打印替换结果

文章作者: 梁绍波
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 梁绍波 !
评论
  目录