getopts - 다음 $OPTARG를 매개변수로 읽는 것을 방지하는 방법은 무엇입니까?

getopts - 다음 $OPTARG를 매개변수로 읽는 것을 방지하는 방법은 무엇입니까?

방금 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별로 도움이 되지 않을 것입니다. 스스로 분석하는 것이 좋습니다.

관련 정보