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

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 -fNOK: -로 시작하는 문자열이 플래그로 감지되지 않는 이유는 무엇입니까?

답변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.

명령줄 옵션은 인수를 모두 허용하거나 인수를 허용하지 않을 수 있습니다.

관련 정보