쉘 스크립트의 "대시" 매개변수

쉘 스크립트의 "대시" 매개변수

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

./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

관련 정보