পদ্ধতি # 1: getopt [গুলি] ছাড়াই ব্যাশ ব্যবহার করা
কী-মান-জুটি যুক্তিগুলি পাস করার দুটি সাধারণ উপায় হ'ল:
স্পেস-বিভাজক স্থান (যেমন, --option argument
) (গোটপট [গুলি] ছাড়াই)
ব্যবহার 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
সমান সমান-পৃথক (উদাহরণস্বরূপ --option=argument
) (getopt [গুলি] ছাড়াই)
ব্যবহার 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 [গুলি] দিয়ে ব্যাশ ব্যবহার করা
থেকে: http://mywiki.wooledge.org/BashFAQ/035#getopts
getopt (1) সীমাবদ্ধতা (পুরানো, তুলনামূলক-সাম্প্রতিক getopt
সংস্করণ):
- খালি স্ট্রিংগুলি যুক্তিগুলি পরিচালনা করতে পারে না
- এম্বেড শ্বেত স্পেস দিয়ে যুক্তিগুলি পরিচালনা করতে পারে না
আরও সাম্প্রতিক getopt
সংস্করণগুলিতে এই সীমাবদ্ধতা নেই।
অতিরিক্তভাবে, পসিএক্স শেল (এবং অন্যান্য) অফার করে 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
স্বয়ংক্রিয়ভাবে সাধারণত ইউনিক্স উপায়ে একাধিক একক বিকল্পগুলি পরিচালনা করতে পারে ।
এর অসুবিধাটি getopts
হ'ল এটি অতিরিক্ত কোড ছাড়াই সংক্ষিপ্ত বিকল্পগুলি ( -h
, না --help
) পরিচালনা করতে পারে ।
একটি গিওপটস টিউটোরিয়াল রয়েছে যা ব্যাখ্যা করে যে সমস্ত সিনট্যাক্স এবং ভেরিয়েবলগুলি কী বোঝায়। ব্যাশে, রয়েছে 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