Metode # 1: Menggunakan bash tanpa getopt [s]
Dua cara umum untuk menyampaikan argumen pasangan kunci-nilai adalah:
Bash Space-Separated (eg, --option argument
) (tanpa getopt [s])
Pemakaian 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
output dari copy-paste blok di atas:
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 (eg, --option=argument
) (tanpa getopt [s])
Pemakaian 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
output dari copy-paste blok di atas:
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
Untuk lebih memahami ${i#*=}
pencarian "Penghapusan Substring" dalam panduan ini . Secara fungsional ini setara dengan `sed 's/[^=]*=//' <<< "$i"`
panggilan subproses yang tidak perlu atau `echo "$i" | sed 's/[^=]*=//'`
yang memanggil dua subproses yang tidak perlu.
Metode # 2: Menggunakan bash dengan getopt [s]
dari: http://mywiki.wooledge.org/BashFAQ/035#getopts
batasan getopt (1) ( getopt
versi lama, relatif baru ):
- tidak dapat menangani argumen yang merupakan string kosong
- tidak dapat menangani argumen dengan spasi putih tertanam
getopt
Versi yang lebih baru tidak memiliki batasan ini.
Selain itu, shell POSIX (dan lainnya) menawarkan getopts
yang tidak memiliki batasan ini. Saya telah memasukkan getopts
contoh sederhana .
Pemakaian 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
output dari copy-paste blok di atas:
verbose=1, output_file='/etc/hosts', Leftovers: foo bar
Keuntungannya getopts
adalah:
- Ini lebih portabel, dan akan bekerja di cangkang lain seperti
dash
.
- Itu dapat menangani beberapa opsi tunggal seperti
-vf filename
dalam cara Unix yang khas, secara otomatis.
Kerugiannya getopts
adalah ia hanya bisa menangani opsi pendek ( -h
, tidak --help
) tanpa kode tambahan.
Ada tutorial getopts yang menjelaskan apa arti semua sintaks dan variabel. Di bash, ada juga help getopts
, yang mungkin informatif.
zparseopts -D -E -M -- d=debug -debug=d
Dan memiliki keduanya-d
dan--debug
dalam$debug
arrayecho $+debug[1]
akan mengembalikan 0 atau 1 jika salah satu dari mereka digunakan. Ref: zsh.org/mla/users/2011/msg00350.html