shell - /bin/sh:使用 getopt 解析长选项,格式为 --parameter='value'
问题描述
我有以下片段来解析/bin/dash
.
该选项-n|--dry-run
不带任何参数。但--exclude
应该采用 . 形式的字符串--exclude='foo'
。使事情进一步复杂化,--exclude
没有短期的选择。
以下代码在我使用时有效script.sh --exclude
,但是当我使用时script.sh --exclude='foo'
,出现错误:
option '--exclude' doesn't allow an argument
这是我的代码:
#!/bin/sh
OPTS=$(getopt --options 'n' --long 'exclude,dry-run' --name "$0" -- "$@")
if [ $? != 0 ] ; then
printf "\n\033[1;31m Error:\033[0m Failed to parse options...exiting.\n\n"
exit 1
fi
eval set -- "$OPTS"
unset OPTS
# extract options and their arguments into variables.
while true ; do
case "$1" in
--exclude )
EXCLUDE="y"
shift
;;
-n | --dry-run )
DRYRUN="y"
shift
;;
-- )
shift
break
;;
*)
printf "\n\033[1;31m Error:\033[0m Invalid option: \033[1;31m-$OPTARG\033[0m\n\n"
exit 1
;;
esac
done
echo \$\@ = $@
我必须改变什么才能使用--exclude='foo'
?
解决方案
您需要通过将 a 附加到名称来指定--exclude
可以接受参数。:
OPTS=$(getopt --options 'n' --long 'exclude:,dry-run' --name "$0" -- "$@")
从手册页:
-l, --longoptions longopts
要识别的长(多字符)选项。通过用逗号分隔名称,可以一次指定多个选项名称。此选项可能不止一次给出,longopts 是累积的。 longopts 中的每个长选项名称后面可以跟一个冒号表示它有一个必需的参数,后面跟两个冒号表示它有一个可选的参数。
推荐阅读
- angular - 如何在 Angular 6 中编辑环境变量而不重建?
- sql - 引用表中没有与外键中的列列表匹配的主键或候选键
- javascript - document.execCommand("copy") 不适用于所有浏览器
- eclipselink - EclipseLink Moxy 与 Java11
- react-native - 如何在 React-native 中调用 Field 渲染方法之外的函数?
- monitoring - Grafana/Graphite 将 y 轴标签更改为折线图的 %
- vb.net - 为什么我没有将对象引用设置为 Google Drive Api 中的对象实例?
- vb.net - 为什么其他列也不接受 datagridview 单元格格式的字母?
- javascript - 不能将 @Res() 与 FilesInterceptor() 一起使用
- python - 运行 pytest 测试给 pluggy 错误,设置有问题吗?