getopts
bash를 사용하여 명령줄 인수를 처리하려고 합니다 . 요구 사항 중 하나는 원하는 만큼의 옵션 인수(따옴표 제외)를 처리하는 것입니다.
첫 번째 예(첫 번째 매개변수만 가져오기)
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$]