getopt 基本也自带
最后更新于:2022-04-02 03:53:25
[TOC]
## getopt
- 支持长参数
## 语法
```
-o,--options 如"ab:c::",表示可接受的短选项为-a -b -c,
-a选项不接参数
-b选项后必须接参数
-c选项的参数为可选的
-l,--long 可接受的长选项,用逗号分开,冒号的意义同短选项
-n 选项后接选项解析错误时提示的脚本名字
```
实例:
```
// 声明 -a -o为短连接参数, --arg,--options 为长连接参数
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n "$0" -- "$@"`
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"
```
## 实例
### 错误提示 ``` > ./test.sh -f ./test.sh: invalid option -- 'f' Terminating... ``` ### 短选项不带参数 ``` > ./test.sh -a Option a ``` 测试带参数的选项,并不会报错 ``` ./test.sh -a asd Option a ``` ### 短选项带参数 测试必须带参数的值 ``` > ./test.sh -b abc Option b, argument abc ``` 不带参数,则报错 ``` > ./test.sh -b ./test.sh: option requires an argument -- 'b' Terminating... ``` ### 短选项带可选参数 带参数 ``` > ./test.sh -c Option c, no argument ``` 不带参数 ``` > ./test.sh -c abc Option c, no argument ``` ### 长选项带可选参数 ``` > ./test.sh -clong abc Option c, argument long ```
';
test.sh
``` #!/bin/bash ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n "$0" -- "$@"` # 检测是否有未知参数,在-n 的提示后,执行 if [ $? != 0 ]; then echo "Terminating..." exit 1 fi #将规范化后的命令行参数分配至位置参数($1,$2,...) eval set -- "${ARGS}" while true do case "$1" in -a|--along) echo "Option a"; shift ;; -b|--blong) echo "Option b, argument $2"; shift 2 ;; -c|--clong) case "$2" in "") echo "Option c, no argument"; shift 2 ;; *) echo "Option c, argument $2"; shift 2; ;; esac ;; --) shift break ;; *) echo "Internal error!" exit 1 ;; esac done ```### 错误提示 ``` > ./test.sh -f ./test.sh: invalid option -- 'f' Terminating... ``` ### 短选项不带参数 ``` > ./test.sh -a Option a ``` 测试带参数的选项,并不会报错 ``` ./test.sh -a asd Option a ``` ### 短选项带参数 测试必须带参数的值 ``` > ./test.sh -b abc Option b, argument abc ``` 不带参数,则报错 ``` > ./test.sh -b ./test.sh: option requires an argument -- 'b' Terminating... ``` ### 短选项带可选参数 带参数 ``` > ./test.sh -c Option c, no argument ``` 不带参数 ``` > ./test.sh -c abc Option c, no argument ``` ### 长选项带可选参数 ``` > ./test.sh -clong abc Option c, argument long ```