그래서 매개변수 다음에 각 위치 매개변수를 가져오도록 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'
옵션에 대한 인수로 옵션 뒤의 첫 번째 단어만 가져옵니다.
반복합니다. 쉬운 길을 택하고 주장을 반드시 인용하세요.