getopt

Reference

set –

set --是根据分隔符IFS,把值依次赋给$1,$2,$3,例子2就是展示这个。

getopt

$ getopt --help

用法:
 getopt optstring parameters
 getopt [options] [--] optstring parameters
 getopt [options] -o|--options optstring [options] [--] parameters

选项:
 -a, --alternative            允许长选项以 - 开始
 -h, --help                   这个简短的用法指南
 -l, --longoptions <长选项>  要识别的长选项
 -n, --name <程序名>         将错误报告给的程序名
 -o, --options <选项字符串>  要识别的短选项
 -q, --quiet                  禁止 getopt(3) 的错误报告
 -Q, --quiet-output           无正常输出
 -s, --shell <shell>          设置 shell 引用规则
 -T, --test                   测试 getopt(1) 版本
 -u, --unquoted               不引用输出
 -V, --version                输出版本信息

注意getopt等输出,--之后的内容不会用来去匹配options,在输出中会在--后面打印出来
在输出中,--前面的是匹配options的结果
# getopt a:b -a aa -b -- 1 2 3
 -a aa -b -- 1 2 3
# getopt a:b -a aa -- -b -- 1 2 3
 -a aa -- -b -- 1 2 3

把getopt的输出传递给set --,就可以获取$1,$2..的值了
# eval set -- $(getopt a:b -a aa -b -- 1 2 3)
# echo $@
-a aa -b -- 1 2 3
# eval set -- $(getopt a:b -a aa -- -b 1 2 3)
# echo $@
-a aa -- -b 1 2 3
# echo $1
-a
# echo $2
aa
# echo $3
--
# echo $4
-b
# echo $5
1
# echo $6
2
# echo $7
3

getopt sample

#!/bin/bash
  
opts=$(getopt -o a:b:s:u -l av:,bv:,sv:,uv -- "$@")
echo $opts
eval set -- $opts

while :;
do
        case $1 in
                "-a" | "--av") shift; echo "a $1";;
                "-b" | "--bv") shift; echo "b $1";;
                "--") shift; break;;
        esac
        shift
done

# 上面的脚本中,如果不使用eval,那么处理不了参数中的空格,
# ./gopt.sh -a a -b "b1 b2"
-a 'a' -b 'b1 b2' --
a 'a'
b 'b1

# 使用了eval之后,b的值就正常了
# ./gopt.sh -a a -b "b1 b2"
-a 'a' -b 'b1 b2' --
a a
b b1 b2

另外要注意的是,使用了option的时候,option之后必须有--,否则不能正常执行

getopts

只支持短选项
getopts命令是用来解析Shell脚本命令行参数的工具,getopts命令参数包含需要被识别的选项字符,
如果选项字符后面跟着一个冒号,则表明该字符选项需要一个命令行参数(选项字符与对应的命令行参数之间以空格分隔)(注意:冒号&问号不能被用作为选项字符)。
getopts命令每次被调用时,它会将下一个选项字符放置到变量中,OPTARG则可以拿到参数值;如果option前面加冒号,则代表忽略错误

getopts 一般用在循环中,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法。
即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0;
如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。
getopts还包含两个内置变量,及OPTARG和OPTIND
OPTARG 就是将选项后面的参数(或者描述信息DESCPRITION)保存在此变量当中。
OPTIND 这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)

while getopts "n:c:o:h" OPT;do
	case $OPT in
		"n") NETWORK_DIR="$OPTARG";;
		"c") CASE_DIR="$OPTARG";;
		"o") OWNER="$OPTARG";;
		"h") usage;;
		"?") usage;;
	esac
done