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'

オプションの引数として、オプションの後の最初の単語のみを取得します。

繰り返します。簡単な方法を選択し、主張を必ず引用してください。

おすすめ記事