쉘 스크립트에 대한 "대시" 인수

쉘 스크립트에 대한 "대시" 인수

내가 사용하는 대부분의 쉘 스크립트에는 다음과 같은 구문이 있습니다.

./shellscript.sh -first_argument_flag <first_argument_value> -second_argument_flag <second_argument_value>

하지만 쉘 스크립터를 위한 모든 온라인 리소스에서는 다음과 같은 위치 인수 전달에 대해서만 논의합니다.

./shellscript.sh <first_argument_value> <second_argument_value> 

이후에 스크립트에서 , 등으로 사용 "$1"됩니다 "$2".

위치 인수 구문보다는 사용자 친화적인 첫 번째 구문을 사용하고 싶습니다. 예를 들어, 플래그 -f로 파일 이름을, 플래그 -d로 디렉토리를 에코한다고 가정해 보겠습니다. 이 스크립트를 echofd.sh라고 부르세요. 나는 원해요

./echofd.sh -f myfile.txt -d /my/directory/ 

출력을 생성하기 위해

귀하의 파일은 myfile.txt입니다.

귀하의 디렉터리는 /my/directory/입니다.

-f 및 -d가 스크립트 호출 시 어떤 순서로 배치되는지에 관계없이.

답변1

거기에getopts표준(내장) 유틸리티POSIX 쉘에서 명령줄 인수를 구문 분석합니다.

다음 템플릿을 사용할 수 있습니다.

#! /bin/sh -
PROGNAME=$0

usage() {
  cat << EOF >&2
Usage: $PROGNAME [-v] [-d <dir>] [-f <file>]

-f <file>: ...
 -d <dir>: ...
       -v: ...
EOF
  exit 1
}

dir=default_dir file=default_file verbose_level=0
while getopts d:f:v o; do
  case $o in
    (f) file=$OPTARG;;
    (d) dir=$OPTARG;;
    (v) verbose_level=$((verbose_level + 1));;
    (*) usage
  esac
done
shift "$((OPTIND - 1))"

echo Remaining arguments: "$@"

이는 다른 표준 명령과 마찬가지로 표준 방식으로 인수를 구문 분석합니다. 예를 들어 다음과 같이 호출할 수 있습니다.

myscript -vvv -f file -d dir other arg
myscript -ffile -ddir -- other arg

보다POSIX 사양자세한 내용은 쉘 매뉴얼을 참조하세요.

답변2

#!/bin/bash
myfile=''
mydir=''

parse_args() {
    case "$1" in
        -d)
            mydir="$2"
            ;;
        -f)
            myfile="$2"
            ;;
        *)
            echo "Unknown or badly placed parameter '$1'." 1>&2
            exit 1
            ;;
    esac
}

while [[ "$#" -ge 2 ]]; do
    parse_args "$1" "$2"
    shift; shift
done

관련 정보