util-linux 2.38版getopt如何实现长选项可选参数空格分隔输入?
关于util-linux 2.38版getopt长可选参数格式的问题
util-linux系列的getopt(包括你使用的2.38版本)不支持让长可选参数通过--option value这种空格分隔的方式传递参数值,这是它的设计特性决定的。
原因说明
长可选参数通过::定义,这类参数的规则是:参数值必须紧跟在=符号后面(比如--option=value)。如果用空格分隔,getopt会默认后面的value是独立的非选项位置参数,给--option分配空值——这正是你示例里出现的情况。
这和强制参数(用:定义)的逻辑不同:强制参数会强制把下一个参数当作自己的值,而可选参数因为本身允许无值,getopt无法判断空格后的内容是参数值还是后续的位置参数,所以不会自动关联。
替代方案(如果一定要用空格格式)
如果你不想接受--option=value的格式,只能对getopt的输出做简单后处理,不用写复杂的case语句。比如在shell脚本里,可以检查输出中是否存在--option ''且后面跟着非选项参数,然后把第一个非选项参数移到--option的参数位置。
举个简单的处理示例(假设getopt的结果存在变量ARGS中):
# 把ARGS拆分成数组 IFS=' ' read -r -a ARRAY <<< "$ARGS" for i in "${!ARRAY[@]}"; do if [[ "${ARRAY[i]}" == "--option" && "${ARRAY[i+1]}" == "''" && "${ARRAY[i+2]}" == "--" && "${ARRAY[i+3]}" != "" ]]; then # 替换空值为实际参数 ARRAY[i+1]="'${ARRAY[i+3]}'" # 删除后面的冗余参数 unset ARRAY[i+3] # 重新拼接成ARGS ARGS="${ARRAY[*]}" break fi done
这个逻辑针对你的特定场景,要是有多个可选参数需要处理,只需稍作调整,整体复杂度不高。
总结
如果不想自己做后处理,就只能接受--option=value的格式——这是util-linux getopt的既定规则,没有配置参数可以修改这个行为。
内容的提问来源于stack exchange,提问作者louigi600
相关产品推荐
相关产品推荐

