나는 이것을 사용하고 있습니다 :
예를 들어./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
NOK: -로 시작하는 문자열이 플래그로 감지되지 않는 이유는 무엇입니까?
답변1
getopts
옵션 -d
이 인수를 허용해야 한다고 말했는데 , 명령줄에서 이를 사용하고 있는 경우 "는 옵션 에 지정한 인수입니다 " -d -f myformat
라고 명확하게(?) 말합니다 .-f
-d
이는 코드의 버그가 아니라 명령줄에서 스크립트 사용의 버그입니다.
코드에서는 옵션 매개변수가 올바른지, 모든 옵션이 적절한 방식으로 설정되었는지 확인해야 합니다.
이럴 수도 있지
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
위 코드의 변수 값에 대해 루프를 실행하기 dir
전에 먼저 해당 기본값으로 설정할 수 있습니다 while
.
명령줄 옵션은 인수를 모두 허용하거나 인수를 허용하지 않을 수 있습니다.