Phương pháp # 1: Sử dụng bash mà không có getopt [s]
Hai cách phổ biến để truyền các đối số cặp khóa-giá trị là:
Bash Space-Tách (ví dụ, --option argument
) (không có getopt [s])
Sử dụng 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
đầu ra từ sao chép khối trên:
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-Tách (ví dụ, --option=argument
) (không có getopt [s])
Sử dụng 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
đầu ra từ sao chép khối trên:
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
Để hiểu rõ hơn về ${i#*=}
tìm kiếm "Loại bỏ chuỗi con" trong hướng dẫn này . Nó có chức năng tương đương với việc `sed 's/[^=]*=//' <<< "$i"`
gọi một quy trình con không cần thiết hoặc `echo "$i" | sed 's/[^=]*=//'`
gọi hai quy trình con không cần thiết.
Phương pháp # 2: Sử dụng bash với getopt [s]
từ: http://mywiki.wooledge.org/BashFAQ/035#getopts
giới hạn getopt (1) ( getopt
phiên bản cũ hơn, tương đối gần đây ):
- không thể xử lý các đối số là các chuỗi rỗng
- không thể xử lý các đối số với khoảng trắng được nhúng
Các getopt
phiên bản gần đây không có những hạn chế này.
Ngoài ra, vỏ POSIX (và các loại khác) cung cấp getopts
không có những hạn chế này. Tôi đã bao gồm một đơn giảngetopts
ví dụ .
Sử dụng 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
đầu ra từ sao chép khối trên:
verbose=1, output_file='/etc/hosts', Leftovers: foo bar
Những lợi thế của getopts
:
- Nó dễ mang theo hơn và sẽ hoạt động trong các shell khác
dash
.
- Nó có thể tự động xử lý nhiều tùy chọn đơn lẻ như
-vf filename
theo cách Unix điển hình.
Nhược điểm của getopts
nó là chỉ có thể xử lý các tùy chọn ngắn ( -h
không phải --help
) mà không có mã bổ sung.
Có một hướng dẫn getopts giải thích tất cả các cú pháp và các biến có nghĩa là gì. Trong bash, cũng có help getopts
, có thể là thông tin.
zparseopts -D -E -M -- d=debug -debug=d
Và có cả hai-d
và--debug
trong$debug
mảngecho $+debug[1]
sẽ trả về 0 hoặc 1 nếu một trong số đó được sử dụng. Tham chiếu: zsh.org/mla/users/2011/msg00350.html