![스크립트에서 여러 번 호출되는 함수의 getopts, getopts는 첫 번째 함수 호출 이후 어떤 옵션도 감지하지 않습니다.](https://linux55.com/image/155470/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%EB%B2%88%20%ED%98%B8%EC%B6%9C%EB%90%98%EB%8A%94%20%ED%95%A8%EC%88%98%EC%9D%98%20getopts%2C%20getopts%EB%8A%94%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%ED%95%A8%EC%88%98%20%ED%98%B8%EC%B6%9C%20%EC%9D%B4%ED%9B%84%20%EC%96%B4%EB%96%A4%20%EC%98%B5%EC%85%98%EB%8F%84%20%EA%B0%90%EC%A7%80%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
getopts
매뉴얼 페이지를 읽었 지만 이 사용 사례에 대해 아직 잘 모르겠습니다.
getopts
동일한 스크립트에서 함수가 두 번째로 호출되었을 때 사용 가능한 옵션이 감지되지 않았습니다.
내 디버그 출력에서 볼 수 있듯이 echo
모든 위치 매개변수는 두 함수 호출 모두에 존재합니다.$@
두 번째 create_db
함수 호출 에서는 getopts
while 루프가 입력되지 않아 내 변수가 설정 TYPE
되지 ENVIRON
않습니다.
어떤 아이디어가 있나요?
함수 정의( create_db
)
function create_db {
local TYPE SIZE ENVIRON
TYPE=''
SIZE=''
ENVIRON=''
print_usage() {
echo -e $"\nUsage: create_db -t {mysql|redis|rabbitmq|sftp|elasticsearch} -e <environment_name> -s <size_in_GB>"
echo "Required args: -t, -e"
echo "Optional args: -s"
}
echo "@: $@"
echo "0: $0"
echo "1: $1"
echo "2: $2"
echo "3: $3"
echo "4: $4"
echo "5: $5"
echo "6: $6"
# parse flags
while getopts 't:s:e:h' flag; do
echo "flag: $flag"
echo "opt: ${OPTARG}"
case "${flag}" in
t) TYPE="${OPTARG}" ;;
s) SIZE="${OPTARG}" ;;
e) ENVIRON="${OPTARG}" ;;
h) print_usage
exit 0 ;;
*) print_usage >&2
exit 1 ;;
esac
done
shift "$(( OPTIND - 1 ))"
echo "TYPE: ${TYPE}"
echo "ENVIRON: ${ENVIRON}"
... DO WORK ...
}
environment-setup-from-scratch.sh
스크립트( ) 호출됨
#!/bin/bash
# import functions from utils file
. "${0%/*}/environment-setup-utils.sh"
ENVIRONMENT="${1}"
create_db -t "elasticsearch" -e "${ENVIRONMENT}"
create_db -t "mysql" -e "${ENVIRONMENT}"
create_db -t "redis" -e "${ENVIRONMENT}"
터미널 출력
$ ./environment-setup-from-scratch.sh sandbox
@: -t elasticsearch -e sandbox
0: ./environment-setup-from-scratch.sh
1: -t
2: elasticsearch
3: -e
4: sandbox
5:
6:
flag: t
opt: elasticsearch
flag: e
opt: sandbox
TYPE: elasticsearch
ENVIRON: sandbox
@: -t mysql -e sandbox
0: ./environment-setup-from-scratch.sh
1: -t
2: mysql
3: -e
4: sandbox
5:
6:
TYPE:
ENVIRON:
답변1
전화할 때마다선택 항목 가져오기, $OPTIND를 사용합니다.
애플리케이션이 OPTIND 값을 1로 설정하면 새 매개변수 세트(현재 위치 매개변수 또는 새 인수 값)를 사용할 수 있습니다.모든 호출에서 서로 다르거나 OPTIND 값을 1이 아닌 값으로 수정하는 인수(위치 인수 또는 인수 피연산자)를 사용하여 단일 셸 실행 환경에서 getopts를 여러 번 호출하려는 다른 시도는 지정되지 않은 결과를 생성합니다.
(내 강조). OPTIND는 getopts를 호출하기 전에 재설정해야 합니다. 아마도 다음과 같습니다.
# ...
# parse flags
OPTIND=1
while getopts 't:s:e:h' flag; do
# ...