옵션 끝을 처리하는 방법 - getopts에서

옵션 끝을 처리하는 방법 - getopts에서

나는 bash 스크립트의 매개변수를 구문 분석하기 위해 getopts를 사용합니다.

while getopts ":hd:" opt; do
  case $opt in
    d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
    h ) helptext
      graceful_exit ;;
    * ) usage
      clean_up
      exit 1
  esac
done

exeparams="$*"

exeparams해결되지 않은 옵션/인수는 모두 저장됩니다. exeparams를 사용하여 스크립트 내에서 실행될 명령에 대한 옵션(스크립트 자체 옵션과 겹칠 수 있음)을 저장하고 싶기 때문에 --를 사용하여 스크립트에 전달된 옵션을 끝내고 싶습니다. 예를 들어 통과하면

myscript -d myscriptparam -- -d internalparam

exeparams개최됩니다

-- -d internalparam

--이제 이러한 매개변수를 내부 명령에 전달하기 위해 선행 부분을 제거하고 싶습니다 . 이를 수행하는 우아한 방법이 있습니까? 아니면 --getopts에서 가져오지 않고 나머지만 포함하는 문자열을 얻을 수 있습니까?

답변1

내장 된 shift. getopts루프가 완료되면,

shift "$((OPTIND - 1))"

처리된 모든 옵션이 제거됩니다.

여기에서 --스크립트 첫 번째 부분(이전)의 비옵션 인수(있는 경우) 처리를 완료해야 합니다. 일단 마주치면 --뒷부분( -d internalparam뒷부분 --)만 남을 때까지 밖으로 빼냅니다. 단방향( bash구문 사용):

while [[ $# -gt 0 ]]; do
    # process next argument
    case $1 in
    foo) # process foo
    ;;
    --) shift; break;; # found '--', discard it and exit loop
    *) # handle unrecognized argument
    ;;
    esac
    # not '--', so discard the argument and continue
    shift
done

마지막으로, 전달할 수 있는 두 번째 옵션/매개변수 세트만 남습니다. 하다아니요$*나머지 매개변수를 다른 명령에 전달하는 데 사용됩니다 . 대체를 사용하면 "$@"원래 단어 분할이 유지됩니다.

external_command "$@"

답변2

어때요?

# ... getopts processing ...

[[ $1 = "--" ]] && shift
exeparams=("$@")

매개변수를 저장하려면 배열을 사용해야 합니다. 그러면 공백이 포함된 모든 매개변수가 올바르게 처리됩니다. 배열 역참조"${exeparams[@]}"

관련 정보