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'

옵션에 대한 인수로 옵션 뒤의 첫 번째 단어만 가져옵니다.

반복합니다. 쉬운 길을 택하고 주장을 반드시 인용하세요.

관련 정보