getopts是一个内置的命令行参数解析工具,利用它可以让脚本支持短命令行参数解析,例如
python -V
curl http://127.0.0.1/base.dat -o base.dat
但它本身不支持长命令行参数解析,例如:
python --version
wget --tries=3 URL
java -jar application.jar --spring.profiles.active=prod
shell中要解析长命令行参数可以使用getopt工具,这是一个独立的外部程序,功能强大但相对复杂
以下做法是基于getopts,特殊处理-参数来达到处理长命令行参数的效果
longopts.sh
#!/bin/bash
#使用getopts处理长命令行参数和短命令行参数
# 长命令行参数处理
# 使用示例: --file=base.dat --name="Michael Jordan"
function longopts(){
case $1 in
file)
echo "file=$2"
;;
name)
echo "name=$2"
;;
version)
echo "v2.2.2"
;;
help)
help ;;
*)
echo "无效或不存在的选项, 使用--help或-h获取帮助";exit 4 ;;
esac
}
# 获取帮助
function help(){
read -d '' help << EOF
usage: [-f <file>|--file=<file>][-h|--help][-v|--version]
-f <file> | --file=<file> 指定文件
--name=<name> 指定姓名
-h | --help 获取帮助
-v | --version 查询版本
EOF
echo "$help"
exit 4
}
# 短命令行参数处理 这里直接转到对应的长命令参数
while getopts ":f:vVh-:" opts; do
case $opts in
f)
longopts "file" "$OPTARG" ;;
v)
longopts "version";;
V)
longopts "version";;
h)
longopts "help" ;;
-)
# 配置值空格兼容
kv=${OPTARG// /@blank9527}
array=(${kv/=/ })
longopts "${array[0]}" "${array[1]//@blank9527/ }"
;;
?) longopts ;;
esac
done
[ $# = 0 ] && help
使用:
sh longopts.sh -v
>>v2.2.2
sh longopts.sh --version
>>v2.2.2
sh longopts.sh --file=base.dat --name="Michael Jordan"
>>file=base.dat
>>name=Michael Jordan