방금 getopts를 사용하기 시작했는데 문제가 발견되었습니다.
예를 들어 다음과 같은 스크립트가 있습니다.
while getopts "h:loav" opt; do
case $opt in
h)
h=$OPTARG
echo $h
;;
하지만 실행해보면:
$ ./ftpclean.sh -h -l
-l
두 번째 옵션을 첫 번째 옵션에 대한 인수로 전달합니다. 따라서 사용자가 인수 설정을 잊어버린 경우:
$ ./ftpclean.sh -h argument
argument
getopts
설정할 것 echo *second option*
입니다 ...
이를 피할 수 있는 "법적" 방법이 있나요?
내가 찾은 가장 좋은 해결책은 다음 기능을 추가하는 것입니다.
function checkargs () {
if [[ $OPTARG =~ ^-[a/l/o/a/v]$ ]]
then
echo "OPTERR"
exit 1
fi
}
변수를 설정하기 전에 실행하십시오.
while getopts "h:loav" opt; do
case $opt in
h)
checkargs
h=$OPTARG
echo $h
;;
그래서 지금:
$ ./ftpclean.sh -h -l
OPTERR
답변1
getopts h:
이 옵션에 -h
인수가 필요함을 나타냅니다. 옵션에 대한 인수는 옵션 자체와 동일한 단어에 있을 수 있으며, 다음 단어에 아무것도 없는 경우에도 가능합니다. 빈 인수를 지정하는 유일한 방법은 옵션 뒤에 null 단어를 전달하는 것입니다.
./ftpclean.sh -h -l
라고 쓰면 -l
옵션의 매개변수입니다 -h
. 을 쓸 수도 있습니다 ./ftpclean.sh -h-l
. 빈 매개변수를 에 전달하려면 -h
을 작성하면 됩니다 ./ftpclean.sh -h '' -l
.
Unix 인수 규칙을 위반하고 인수가 명령과 동일한 단어가 되도록 요구하려는 것 같습니다. 이 작업을 수행하려는 경우(사용자를 혼란스럽게 하고 말이 안 되는 비표준적인 작업을 수행한 것에 대해 저주하게 만들 수 있으므로 강력히 권장하지 않습니다), getopts
별로 도움이 되지 않을 것입니다. 스스로 분석하는 것이 좋습니다.