방법 # 1 : getopt [s]없이 bash 사용
키-값 쌍 인수를 전달하는 두 가지 일반적인 방법은 다음과 같습니다.
Bash Space-Separated (예 --option argument
:) (getopt없이)
용법 demo-space-separated.sh -e conf -s /etc -l /usr/lib /etc/hosts
cat >/tmp/demo-space-separated.sh <<'EOF'
#!/bin/bash
POSITIONAL=()
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-e|--extension)
EXTENSION="$2"
shift # past argument
shift # past value
;;
-s|--searchpath)
SEARCHPATH="$2"
shift # past argument
shift # past value
;;
-l|--lib)
LIBPATH="$2"
shift # past argument
shift # past value
;;
--default)
DEFAULT=YES
shift # past argument
;;
*) # unknown option
POSITIONAL+=("$1") # save it in an array for later
shift # past argument
;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
echo "FILE EXTENSION = ${EXTENSION}"
echo "SEARCH PATH = ${SEARCHPATH}"
echo "LIBRARY PATH = ${LIBPATH}"
echo "DEFAULT = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
echo "Last line of file specified as non-opt/last argument:"
tail -1 "$1"
fi
EOF
chmod +x /tmp/demo-space-separated.sh
/tmp/demo-space-separated.sh -e conf -s /etc -l /usr/lib /etc/hosts
위의 블록을 복사하여 붙여 넣은 결과 :
FILE EXTENSION = conf
SEARCH PATH = /etc
LIBRARY PATH = /usr/lib
DEFAULT =
Number files in SEARCH PATH with EXTENSION: 14
Last line of file specified as non-opt/last argument:
#93.184.216.34 example.com
Bash Equals-Separated (예 --option=argument
:) (getopt [s]없이)
용법 demo-equals-separated.sh -e=conf -s=/etc -l=/usr/lib /etc/hosts
cat >/tmp/demo-equals-separated.sh <<'EOF'
#!/bin/bash
for i in "$@"
do
case $i in
-e=*|--extension=*)
EXTENSION="${i#*=}"
shift # past argument=value
;;
-s=*|--searchpath=*)
SEARCHPATH="${i#*=}"
shift # past argument=value
;;
-l=*|--lib=*)
LIBPATH="${i#*=}"
shift # past argument=value
;;
--default)
DEFAULT=YES
shift # past argument with no value
;;
*)
# unknown option
;;
esac
done
echo "FILE EXTENSION = ${EXTENSION}"
echo "SEARCH PATH = ${SEARCHPATH}"
echo "LIBRARY PATH = ${LIBPATH}"
echo "DEFAULT = ${DEFAULT}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
echo "Last line of file specified as non-opt/last argument:"
tail -1 $1
fi
EOF
chmod +x /tmp/demo-equals-separated.sh
/tmp/demo-equals-separated.sh -e=conf -s=/etc -l=/usr/lib /etc/hosts
위의 블록을 복사하여 붙여 넣은 결과 :
FILE EXTENSION = conf
SEARCH PATH = /etc
LIBRARY PATH = /usr/lib
DEFAULT =
Number files in SEARCH PATH with EXTENSION: 14
Last line of file specified as non-opt/last argument:
#93.184.216.34 example.com
이 안내서${i#*=}
에서 "하위 문자열 제거"에 대한 검색 을보다 잘 이해하려면 . 그것과 동등한 기능을 하는 불필요한 서브 프로세스를 호출 또는 호출하는 두 불필요한 서브 프로세스.`sed 's/[^=]*=//' <<< "$i"`
`echo "$i" | sed 's/[^=]*=//'`
방법 # 2 : getopt와 함께 bash 사용하기
에서 : http://mywiki.wooledge.org/BashFAQ/035#getopts
getopt (1) 제한 사항 (이전의 비교적 최신 getopt
버전) :
- 빈 문자열 인 인수를 처리 할 수 없습니다
- 공백이 포함 된 인수를 처리 할 수 없습니다
최신 getopt
버전에는 이러한 제한이 없습니다.
또한 POSIX 셸 (및 기타) getopts
은 이러한 제한이없는 것을 제공합니다 . 간단한 getopts
예제를 포함 시켰습니다 .
용법 demo-getopts.sh -vf /etc/hosts foo bar
cat >/tmp/demo-getopts.sh <<'EOF'
#!/bin/sh
# A POSIX variable
OPTIND=1 # Reset in case getopts has been used previously in the shell.
# Initialize our own variables:
output_file=""
verbose=0
while getopts "h?vf:" opt; do
case "$opt" in
h|\?)
show_help
exit 0
;;
v) verbose=1
;;
f) output_file=$OPTARG
;;
esac
done
shift $((OPTIND-1))
[ "${1:-}" = "--" ] && shift
echo "verbose=$verbose, output_file='$output_file', Leftovers: $@"
EOF
chmod +x /tmp/demo-getopts.sh
/tmp/demo-getopts.sh -vf /etc/hosts foo bar
위의 블록을 복사하여 붙여 넣은 결과 :
verbose=1, output_file='/etc/hosts', Leftovers: foo bar
장점 getopts
은 다음 과 같습니다.
- 이식성이 뛰어나고 다른 쉘에서 작동
dash
합니다.
-vf filename
일반적인 Unix 방식 과 같은 여러 단일 옵션을 자동으로 처리 할 수 있습니다 .
의 단점은 getopts
단지 짧은 옵션 (처리 할 수있다 -h
, 없다 --help
추가 코드없이)를.
모든 구문과 변수의 의미를 설명 하는 getopts 학습서 가 있습니다. bash에는 또한 help getopts
유익한 정보가 있습니다.
zparseopts -D -E -M -- d=debug -debug=d
그리고 모두가-d
하고--debug
에$debug
배열echo $+debug[1]
그 중 하나를 사용하는 경우 0 또는 1을 반환은. 참조 : zsh.org/mla/users/2011/msg00350.html