简介
getopt命令可以接受一系列任意形式的命令行选项和参数,并自动将它们转换成适当的格式。
格式说明
getopt三种使用方式
# 第一种:无法处理带有空格的参数
getopt optstring parameters
# 第二种:可以处理带有空格的参数,但是需要结合eval使用
getopt [options] [--] optstring parameters
# 第三种:结合eval既可以处理带有空格的参数,也可以定义长选项(一个字母为短选项,一个字母以上是长选项)
getopt [options] -o|--options optstring [options] [--] parameters
options:getopt自带的参数定义
optstring:自定义选项参数
parameters:参数
理解:通过optstring自定义选项参数字符串格式化传入的parameters(参数),进行输出
要点
双破折线在optstring前和optstring后的区别
- 在optstring前:最后一个参数为双破折线(–);如果定义一个无参数选项(不带冒号)执行时带了参数,参数会在–之后存在;–后如果存在形同自定义选项的写法(-m)会报错;getopt执行的结果值会带有引号
- 在optstring后:optstring – 后面皆为参数;第一个参数为双破折线(–);-- 后如果存在形同自定义选项的写法(-m)不会报错;会将其作为参数进行处理;getopt执行的结果值不会带有引号
选项后一个冒号(:)、两个冒号、没冒号的区别
- 无冒号(:):执行时,只有选项,不带参数。
- 一个冒号(:):执行时必须带有参数(必选)。
- 两个冒号(:):执行时可以选择性带参数,也可以不带(可选)。
多个自定义选项参数之间的分隔
- 长选项:使用逗号(,)分隔
- 短选项:可以使用逗号分隔,也可以不进行分隔,系统自动识别
长短选项执行时注意事项
长选项
- 必选(1冒号):选项和参数之间可以使用等号(=)或空格分隔
- 可选 (2冒号):选项和参数之间必须使用等号(=)进行分隔
使用 -o 或 -l 时,双破折线不能用在optstring前面,需要写在optstring之后(如第三种写法)
getopt命令报错时会继续执行后面的代码,实际使用时需要使用 $? 判断命令执行结果进行处理( 将getopt与eval、set分离处理)
TPS:还有更多细节, 可以实际在Linux命令行进行测验。如使用第三种写法(结合eval、set使用)则基本不会存在问题
使用
Example:
#!/bin/bash
#eval set -- $(getopt -- a:b:s:u "$@")
cmd_getopt=$(getopt -n $0 -o m::f:: -l mark::,file:: -- "$@")
[ $? -ne 0 ] && exit 1
eval set -- "$cmd_getopt"
while [ "$1" ];do
case $1 in
-m|--mark)
mark="$2"
shift 2;;
-f|--file)
file="$2"
shift 2;;
--)
shift
break;;
*)
echo "Usage [-m|-f] operate"
exit 1;;
esac
done
# 查看结果,可根据实际场景调用case中定义的变量
echo mark -- $mark
echo file -- $file