为Bash中的某些参数解析具有多个空格分隔值的可选参数

时间:2017-09-15 13:25:29

标签: bash

我正在尝试编写一个应该接受以下规范方式的脚本:

./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而言)并允许人们使用第一次调用。

任何指针?

2 个答案:

答案 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}}完全。)