Bash getopts 在第一个参数之后采用更多位置参数

Bash getopts 在第一个参数之后采用更多位置参数

所以我不知道如何制作 getopts 以便它获取参数后的每个位置参数。

我的意思如下:这是我的示例代码:

#!/bin/bash
while getopts 'a:b:' thing_here; do
        case $thing_here in
                a) part_1="${OPTARG}" ;;
                b) part_2="${OPTARG}" ;;
                *) echo "invalid option, quitting"
                        exit 1 ;;
        esac
done

echo "part 1 = ${part_1}"
echo "part 2 = ${part_2}"

现在我想要的是以下内容: 输入:

$: ./example_script.sh -a asd qwe zxc -b dfg 213

输出:

part 1 = asd qwe zxc
part 2 = dfg 213

但我实际得到的是以下内容:

part 1 = asd
part 2 =

现在我知道我可以通过将参数括起来来完成我想做的事情:

$: ./example_script.sh -a 'asd qwe zxc' -b 'dfg 213'

但我试图找到的是如何在脚本和 getopts 本身中执行此操作,而不必自己添加引号(对于某些自动化来说更容易)。

答案1

如果您不想将参数括在引号中(最简单且最强大的解决方案),那么您不能使用getopts,并且您必须将某些内容组合在一起,例如:

declare -A args
key=""
for arg; do
    case $arg in
        "-a") key=part_1 ;;
        "-b") key=part_2 ;;
        *)  [[ -n $key ]] || { echo "unexpected argument" >&2; exit 1; }
            args[$key]="${args[$key]}$arg "
            ;;
    esac
done
# turn the array keys into variables
for key in "${!args[@]}"; do declare "$key=${args[$key]% }"; done
echo "part 1 => $part_1"
echo "part 2 => $part_2"

根据您的要求,您不能使用getopt其中任何一个。假设您有 GNU getopt,看看会发生什么:

$ set --  -a asd qwe zxc -b dfg 213
$ getopt -o a:b: -- "$@"
 -a 'asd' -b 'dfg' -- 'qwe' 'zxc' '213'

仅获取选项后的第一个单词作为选项的参数。

我再说一遍,采取简单的路线并确保引用论点。

相关内容