내가 사용하는 대부분의 쉘 스크립트의 구문은 다음과 같습니다.
./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