我有一个 Shell 脚本(适用于 Linux/Mac/Cygwin 用户),它包装了一个可执行 JAR。
在将参数(长形式或短形式)传递给 Java 程序之前,我需要预处理一个选项(即,其目录必须添加到 Java 类路径的路径以及必须传递给 Java 程序的文件名) 。
getopt
getopts
如果我不指定传递给脚本的所有选项,则会抱怨。但是,我只想指定需要预处理的内容(以短形式和长形式)。
还有什么选择呢?
仅供参考,这是我想要做的事情的粗略说明:
#!/bin/sh
# extracts _FOLDER_ and _FILE_ from "--changelog"/"-c" option
# I need the add the _FOLDER_ to Java classpath
# and _FILE_ to my program
java -cp .:_FOLDER_:my.jar my.main.class ALL_OTHER_OPTIONS
答案1
您必须解析所有选项(与包装命令相同的方式),否则您需要诉诸启发式方法并做好在许多情况下失败的准备。
假设你正在写一个:
#! /bin/sh -
# process options
exec cmd "$@"
并cmd
接受-a
, -b
,-c
带参数和-n
,-p
不带参数,并且您的包装器想知道 的参数是什么-c
。
如果脚本被调用为:
wrapper.sh -npc foo
wrapper.sh -b -c -n -ca-c
wrapper.sh -- -cx
它无法找出参数是什么,-c
除非它知道-n
并且-p
不接受参数 and -a
, -b
do 。
您可以使用启发式方法:查找以-
and开头的参数c
,然后查看其后的内容,但这对于上面的所有示例都会失败(除了第一个发生的情况-n
并且-p
不接受参数)。