心路历程
Shell的参数解析分为两种
- 直接从运行行取参数 $0 $1这种
- 进行复杂的参数分析,使用 getopts
getopts的内置参数
根据查询可知 getopts is defined in POSIX®. ,我们找到了一个参考页面,很多关于getopts的讲解里,都说到了两个变量 OPTIND 和 OPTARG, 是两个全局变量,一个代表getopts当前读取到的Index,一个是当前读取到的变量的值
OPTIND
1 | OPTIND=1 |
其中OPTIND代表的意思就是 Holds the index to the next argument to be processed,OPTIND is initially set to 1, and needs to be re-set to 1 if you want to parse anything again with getopts 等于1的原因是第0个是getopts命令行本身,和$0一个原理
shift的作用
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$1、$2、$3丢弃
在执行完 getopts后边可能还会执行,需要把解析过的参数丢弃,所以加上shift “$((OPTIND-1))”
使用方法和OPTARG
- 调用getopts方法
- 然后对getopts的结果进行while循环
getopts 后根据顺序可以接三个参数 getopts OPTSTRING VARNAME [ARGS…]
参数 | 作用 |
---|---|
OPTSTRING | 需要解析的参数 |
VARNAME | 每次解析到的参数 |
ARGS | 如果shell脚本不输入任何参数,则使用这个为默认输入 |
1 | OPTIND=1 |
colon 冒号的作用
在OPTSTRING中如果想对哪个参数后边可以跟一个值,只需要在其后边加冒号 “:” 就可以了,如果开头就是冒号,代表静默异常模式,就是一旦参数异常不出发 “?” Invalid option
如何使用单词参数
根据Stack Overflow回答 getopts 并不提供单词参数的解析能力,所可以通过遍历参数列表+Shift切换的模式进行解析
- 首先把长参数转化为短参数,使用到了 set
- 然后把短参数根据 getopts 解析
有关 set – “$@” “-h” 指令的含义,参考Bash的内置命令set,加入 – 是为了保证 $@ 不会被当成可选字段 [–abefhkmnptuvxBCEHPT]
1 |
|