使用getopt解析为负值的参数-使getopt忽略它们的任何方法吗?

问题描述

我正在使用getopt解析脚本的命令行参数。 所有可选参数(-o和--long)都由getopt处理,但也有强制性参数。参数4可以是路径或值的序列,这些值可以为负。

script.sh mandatory/path/one mandatory/path/two mandatory/file.txt -200.12,32.7,-18.7

如果参数4以负值开头,则-将触发getopt。显然,这会破坏脚本,因为getopt将抱怨未定义的选项。

我可以想到两种解决方法,但这两种方法都很hacky:

  1. 在$ @上执行sed操作,以用一些伪字符串替换-,然后在解析完成getopt之后再次进行sed操作,以再次用-替换伪对象。
ARGS=$(echo "$@" | sed -E "s/-([0-9])/%dummy%\1/g")
set -- "$ARGS"
ARGS=`getopt -o n -l no-act -n $0 -- "$@"`
eval set -- "$ARGS"
while :; do
  case "$1" in
    -n|--no-act)
      norun=1 ;;
    --) 
      shift; break ;;
    *)
      break 
  esac
  shift
done
ARGS=$(echo "$@" | sed -E "s/%dummy%([0-9])/-\1/g")
eval set -- "$ARGS"
  1. 使用getopt -1234567890中的参数定义选项。这会将强制参数4拆分为-200.12,-18.7,可以将其合并为中间变量。最后,必需的参数1-3和4必须再次为set
ARGS=`getopt -o n1:2:3:4:5:6:7:8:9:0: -l no-act -n $0 -- "$@"`
eval set -- "$ARGS"
while :; do
  case "$1" in
    -n|--no-act)
      norun=1 ;;
    -1|-2|-3|-4|-5|-6|-7|-8|-9|-0)
      TEMPVAR=$1$2
      shift ;;
    --) 
      shift; break ;;
    *)
      break 
  esac
  shift
done

必须有一种更优雅的方法来做到这一点。 Getopt在其他方面做得很好,我希望保留它用于命令行解析。

(还有更多选项,我在示例中仅提及-n选项以使代码块简短)

编辑:强制性参数4应该保持为$ 4,因为这行还有进一步的检查。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)