Bash中getopt无法识别带多连字符的引号包裹参数如何解决
问题原因
你当前的代码逻辑存在问题:你提前将第一个入参赋值为msg,随后又把所有入参(包括这个可能以横杠开头的msg)传给getopt解析。按照getopt的规则,除了单独的-和--外,所有以-开头的参数都会被识别为待解析的选项,而你只定义了t这一个合法短选项,其他格式的横杠开头字符串都会被判定为非法选项,自然返回非零状态码触发报错。
解决方案
根据你的使用场景可以选择以下任意一种方案:
方案1:移除多余的getopt逻辑
如果你的_echo函数本身不需要接收任何选项,getopt属于多余代码,直接删除即可,修改后的函数可以正常接收任意格式的字符串:
function _echo() { msg="$1" echo "${msg} <--[this is ok]" echo "" }
方案2:调整getopt解析顺序,先解析选项再取msg
如果你的_echo确实需要支持选项(比如你注释中提到的-t选项),要先完成选项解析,再提取剩余的位置参数作为msg,避免getopt将msg内容当成选项处理:
#!/bin/bash function _echo() { # 第一步:先解析所有入参的选项 local options=$(getopt -q -o t -- "$@") local retval=$? if [ ${retval} -ne 0 ]; then echo "入参解析错误" return 1 fi eval set -- "${options}" # 第二步:提取识别到的选项 local t_flag=0 while true; do case "$1" in -t) t_flag=1 shift ;; --) shift break ;; *) break ;; esac done # 第三步:剩余的第一个参数才是需要输出的msg local msg="$1" echo "${msg} <--[this is ok]" echo "" } # 测试调用 _echo "--" # 正常 _echo "Hello" # 正常 _echo "---------------" # 现在不会报错 _echo "-Hello" # 现在不会报错 # 带选项的调用方式也正常 _echo -t "-------"
方案3:调用时添加--标记
如果你不想修改现有函数代码,可以在调用时在msg参数前加--,getopt遇到--就会停止解析后续所有内容,全部当成普通参数处理:
_echo -- "---------------" # 不会报错 _echo -- "--Hello" # 不会报错
内容的提问来源于stack exchange,提问作者MaXi32
相关产品推荐
相关产品推荐

