介绍
getopts、getopt都可以进行命令行参数解析, 区别在于:
- getopts 只支持单个字符选项的情况, 选项的参数可以是多字符
- getopt 选项和参数都支持多字符(也就是长选项), 例如–prefix=hello
getopts
示例
$ cat my_getopts.sh
#!/bin/bash
# getopts ":ab:c", 第一个冒号的作用是防止输入无效参数时报错
# $OPTARG 可用于获取带参数选项的参数值
# OPTIND是一个特殊的变量,它的初始值是1,每次getopts处理完一个命令参数后就递增它,得到getopts要处理的下一个参数
while getopts ":ab:c" opt; do
case $opt in
a) echo "选项 -a 被指定" ;;
b) echo "选项 -b 被指定,参数为 $OPTARG" ;;
c) echo "选项 -c 被指定" ;;
\?) echo "未知选项: -$OPTARG" ;;
esac
done
$ sh my_getopts.sh # 执行后输出
选项 -a 被指定
选项 -b 被指定,参数为 100
选项 -c 被指定
未知选项: -d
实践使用
需求
- 编写一个安装服务的脚本,支持的选项参数 -i server|client、 -u、和-h
- -i 选项后指定参数server或client 执行下载安装客户端或服务端配置
- -u 选项执行卸载服务
- -h 选项执行打印帮助
实现示例
#!/bin/bash
install_mysvc() {
config_type="$1"
echo "config_type=[${config_type}]"
[[ -z "${config_type}" || "${config_type}" != "server" && "${config_type}" != "client" ]] && \
echo -e "\033[31m错误,配置类型参数未传递\033[0m" && exit 1
[[ "${config_type}" = "server" ]] \
&& echo "执行下载服务端配置" || echo "执行下载客户端配置"
echo "执行其他安装操作"
}
uninstall_mysvc() {
echo "卸载服务"
}
usage() {
echo "我是帮助信息"
}
main() {
[[ $# = 0 ]] && usage && exit 1
while getopts ":i:uh" OPT; do
case $OPT in
i)
install_mysvc "${OPTARG}"
exit 0
;;
u)
uninstall_mysvc
exit 0
;;
h)
usage
exit 0
;;
*)
echo "Usage: $0 [-h]"
exit 1
;;
esac
done
}
main $@
# 验证 sh <脚本名> -i server
getopt
示例
$ cat getopt_study.sh
#!/bin/bash
# getopt -n "$0" -o f:f2::v --long file:,file2::,verbose -- "$@"
# -n 指定参数解析错误时提示的程序名
# :表示必须带参数,::表示选项的参数是可选的
# -o 设置短选项,当参数是可选的时候,参数必须紧跟选项,不能有空格
# --long 设置长选项,以逗号分隔,当参数是可选的时候,需要使用格式 选项=参数
# -- 设置getopt 命令停止解析选项参数,并将剩余的参数视为普通参数。
# 定义默认值
filename=""
verbose=false
# 使用 getopt 获取命令行参数
OPTIONS=$(getopt -n "$0" -o f:f2::v --long file:,file2::,verbose -- "$@")
# 检查 getopt 的返回值
if [ $? != 0 ]; then
echo "参数错误"
exit 1
fi
# 重置命令行参数为 getopt 处理后的结果
eval set -- "$OPTIONS"
# 遍历处理 getopt 的结果
while true; do
case "$1" in
-f|--file)
filename="$2"
shift 2
;;
-f2|--file2)
filename2="$2"
shift 2
;;
-v|--verbose)
verbose=true
shift
;;
--)
shift
break
;;
*)
echo "未知参数"
exit 1
;;
esac
done
# 打印获取到的参数值
echo "文件名:$filename"
echo "文件名2:$filename2"
echo "是否详细输出:$verbose"
echo "其他参数:$@"
$ sh getopt_study.sh -f a.txt --file2=example.txt -v other_argument # 执行示例
文件名:a.txt
文件名2:example.txt
是否详细输出:true
其他参数:other_argument
实践使用
需求
- 编写一个安装服务的脚本,支持的选项参数
- 短选项:-i server|client、 -u、和-h
- 长选项: --install server|client、 --uninstall、和-help
- -i/–install 选项后指定参数server或client 执行下载安装客户端或服务端配置
- -u/–uninstall 选项执行卸载服务
- -h/–help 选项执行打印帮助
实现示例
$ cat install_svc2.sh
#!/bin/bash
install_mysvc() {
config_type="$1"
echo "config_type=[${config_type}]"
[[ -z "${config_type}" || "${config_type}" != "server" && "${config_type}" != "client" ]] && \
echo -e "\033[31m错误,配置类型参数未传递\033[0m" && exit 1
[[ "${config_type}" = "server" ]] \
&& echo "执行下载服务端配置" || echo "执行下载客户端配置"
echo "执行其他安装操作"
}
uninstall_mysvc() {
echo "卸载服务"
}
usage() {
echo "我是帮助信息"
}
main() {
OPTIONS=$(getopt -n "$0" -o i:uh --long install:,install_last:,uninstall,help -- "$@")
eval set -- "$OPTIONS"
while true; do
case "$1" in
-i|--install)
install_mysvc "$2"
shift 2
break
;;
-u|--uninstall)
uninstall_mysvc
shift
break
;;
-h|--help)
usage
shift
break
;;
--)
shift
;;
*)
echo "\033[31mUsage: $0 -h 获取帮助信息\033[0m"
exit 1
;;
esac
done
}
main $@
# 验证 sh install_svc2.sh -i server