getopts를 사용하여 쉘 스크립트 플래그 및 인수를 올바르게 구문 분석하는 방법

이것을 사용하고 있습니다 :

예 : ./imgSorter.sh -d directory -f format

스크립트”내용은 다음과 같습니다.

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

사용 사례 :

$ ./imgSorter.sh -d myDir -d was triggered with myDir 확인

$ ./imgSorter.sh -d -f myFormat -d was triggered with -f 아니요 :-로 시작하는 문자열이 플래그로 감지되지 않는 이유는 무엇입니까?

답변

getopts에게 -d 옵션은 인수를 가져야합니다. 명령 줄에서는 “-f가”-f 명확하게 (?) 표시된 -d -f myformat를 사용합니다. 인수 I “m give to the -d option”.

이것은 코드 오류가 아니라 명령 줄에서 스크립트를 사용할 때 발생합니다.

코드는 옵션 인수가 정확하고 모든 옵션이 적절한 방식으로 설정되어 있는지 확인해야합니다.

아마도

while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo "error" >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo "Option -d missing or designates non-directory" >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo "Option -d designates non-directory" >&2 exit 1 fi 

-d 옵션이 선택 사항이고 변수에 기본값 값을 사용하려는 경우 dir 위 코드에서 dirwhile loop.

명령 줄 옵션은 인수를받을 수도없고 인수 할 수도 없습니다.

댓글

  • 알겠습니다. 감사합니다. @Kusalananda, 나는 getopts가 플래그 시작을 위해 모든 것을 취했다고 잘못 생각했습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다