我正在尝试编写一个应该接受以下规范方式的脚本:
./script.sh first second third
./script.sh --prefix pre --suffixes first second third --something
./scripts.sh -p pre -s first second third --something-else
第三种方式与第二种方式相同(只是短路)。第二种方式在内部翻译为./script.sh pre.first pre.second pre.third
,--something
选项就在那里,因为它控制着一些内部流程。我所挣扎的是如何处理这两种情况。处理零或一个值的可选参数相当简单,但我希望数字是可变的(至少对--suffixes
而言)并允许人们使用第一次调用。
任何指针?
答案 0 :(得分:1)
我想你可能会这样做:
SUFFIXES=()
while [ $# -gt 0 ]; do
case $1 in
'-p'|'--prefix')
shift
PREFIX="$1"
;;
'-s'|'--suffixes')
;;
'--something')
SOMETHING="whatever something is or flags."
;;
*)
if [ -n "${SOMETHING+x}" ]; then
# Any possible "something" args.
echo "Got one something arg: $1"
else
# no '--something' flagged. Must be a suffix...
SUFFIXES+=($1)
fi
;;
esac
shift
done
WHOLE=( "${SUFFIXES[@]/#/$PREFIX}" )
echo "Final result: ${WHOLE[*]}"
试验:
./script first second third --something
Final result: first second third
./script --prefix pre --suffixes first second third --something
Final result: prefirst presecond prethird
./script -p pre -s first second third --something
Final result: prefirst presecond prethird
告诉我你是否需要它。
答案 1 :(得分:0)
让选项采用未知数量的参数(无论是“0或1”或“0或更多”还是“1或更多”)通常是一个坏主意。考虑这种通用调用:
$ do_stuff -q thing thing2 # -q takes no arguments
$ do_stuff -o output thing thing2 # -o takes one argument
$ do_stuff -z z1 z2 thing thing2 # -z takes any number of arguments
我们如何知道z2
与-z
一致但thing
不符合? (您可以添加一个特殊的--z-stop
或类似内容,但如果用户想将该确切字符串传递给-z
该怎么办?)
在你的情况下,你可能有一个外出。如果手动指定字符串(如在第一个命令中)并且也通过前缀/后缀(如第二个命令中那样)没有意义,那么您可以简单地说-s
/ --suffixes
需要0参数,但更改位置参数的解释。 (然后,如果-p
没有-s
没有任何意义,您可以使-p
/ --prefix
成为具有单个(必填)参数的选项,并删除{{ 1}}完全。)