bash에서 getopts를 사용하는 여러 옵션 인수

bash에서 getopts를 사용하는 여러 옵션 인수

Bash를 사용하여 명령줄 인수를 처리하려고 합니다 getopts. 요구 사항 중 하나는 임의 개수의 옵션 인수를 처리하는 것입니다(따옴표 사용 안 함).

첫 번째 예(첫 번째 인수만 가져옴)

madcap:~/projects$ ./getoptz.sh -s a b c
-s was triggered
Argument: a

두 번째 예(나는 이것이 이렇게 동작하기를 원하지만 인수를 인용할 필요는 없습니다."

madcap:~/projects$ ./getoptz.sh -s "a b c"
-s was triggered
Argument: a b c

이를 수행할 수 있는 방법이 있습니까?

지금 가지고 있는 코드는 다음과 같습니다.

#!/bin/bash
while getopts ":s:" opt; do
    case $opt in
    s) echo "-s was triggered" >&2
       args="$OPTARG"
       echo "Argument: $args"
       ;;
       \?) echo "Invalid option: -$OPTARG" >&2
       ;;
    :) echo "Option -$OPTARG requires an argument." >&2
       exit 1
       ;;
    esac
done

이 방법으로 여러 플래그를 지원하고 싶습니다. 예:

madcap:~/projects$ ./getoptz.sh -s a b c -u 1 2 3 4
-s was triggered
Argument: a b c
-u was triggered
Argument: 1 2 3 4

답변1

내 생각에 가장 좋은 방법은 각 인수에 -s를 사용하는 것입니다 -s foo -s bar -s baz.하지만여전히 단일 옵션에 대해 여러 주장을 뒷받침하고 싶다면 다음을 제안합니다.~ 아니다사용 getopts.

다음 스크립트를 살펴보십시오.

#!/bin/bash

declare -a sargs=()

read_s_args()
{
    while (($#)) && [[ $1 != -* ]]; do sargs+=("$1"); shift; done
}

while (($#)); do
    case "$1" in
        -s) read_s_args "${@:2}"
    esac
    shift
done

printf '<%s>' "${sargs[@]}"

-s이(가) 감지되면 명령 read_s_args줄의 나머지 옵션 및 인수와 함께 호출됩니다. read_s_args다음 옵션에 도달할 때까지 인수를 읽습니다. -s에 대한 유효한 인수가 배열에 저장됩니다 sargs.

여기에는샘플 출력:

[rany$] ./script -s foo bar baz -u a b c -s foo1 -j e f g
<foo> <bar> <baz> <foo1>
[rany$]

관련 정보