问题描述
我正在使用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:
- 在$ @上执行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"
- 使用getopt -1234567890中的参数定义选项。这会将强制参数4拆分为
-2
和00.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 (将#修改为@)