जवाबों:
यहाँ bash के लिए एक उदाहरण है:
usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything
where:
-h show this help text
-s set the seed value (default: 42)"
seed=42
while getopts ':hs:' option; do
case "$option" in
h) echo "$usage"
exit
;;
s) seed=$OPTARG
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))
किसी फ़ंक्शन के अंदर इसका उपयोग करने के लिए:
"$FUNCNAME"
बजाय का उपयोग करें$(basename "$0")
local OPTIND OPTARG
कॉल करने से पहले जोड़ेंgetopts
basename
अग्रणी डैश के साथ "-बैश" को पारित करने की कोशिश कर रहा है ।
"$FUNCNAME"
नहीं उल्टा "$0"
। इसके अलावा, जोड़नेlocal OPTIND OPTARG
FUNCNAME
काम करता है। मेरे पास एक फ़ाइल के अंदर मेरे सभी कार्य हैं, इसलिए यह उन्हें दूसरों के लिए कुछ उपयोगी बनाने के लिए एकदम सही है।
"$usage"
हर जगह का उपयोग करने के लिए बोली लगाते हैं ।
shift $((OPTIND - 1))
?
शेल स्क्रिप्ट के लिए पहला तर्क चर के रूप में उपलब्ध है $1
, इसलिए सबसे सरल कार्यान्वयन होगा
if [ "$1" == "-h" ]; then
echo "Usage: `basename $0` [somestuff]"
exit 0
fi
लेकिन शुभ ने क्या कहा।
[
पोसिक्स-अनुरूप संस्करण है।
function
: आप बदलना चाहिए exit 0
साथ return
अगर आप अपने समारोह चलाने के बाद अपने खोल समाप्त करने के लिए नहीं करना चाहती। (मैंने इसे 😂 से पहले किया है)
यहाँ एक हिस्सा है जिसका उपयोग मैं VNC सर्वर शुरू करने के लिए करता हूँ
#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}
stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}
#########################
# The command line help #
#########################
display_help() {
echo "Usage: $0 [option...] {start|stop|restart}" >&2
echo
echo " -r, --resolution run with the given resolution WxH"
echo " -d, --display Set on which display to host on "
echo
# echo some stuff here for the -a or --add-options
exit 1
}
################################
# Check if parameters options #
# are given on the commandline #
################################
while :
do
case "$1" in
-r | --resolution)
if [ $# -ne 0 ]; then
resolution="$2" # You may want to check validity of $2
fi
shift 2
;;
-h | --help)
display_help # Call your function
exit 0
;;
-d | --display)
display="$2"
shift 2
;;
-a | --add-options)
# do something here call function
# and write it in your help function display_help()
shift 2
;;
--) # End of all options
shift
break
;;
-*)
echo "Error: Unknown option: $1" >&2
## or call function display_help
exit 1
;;
*) # No more options
break
;;
esac
done
######################
# Check if parameter #
# is set too execute #
######################
case "$1" in
start)
start # calling function start()
;;
stop)
stop # calling function stop()
;;
restart)
stop # calling function stop()
start # calling function start()
;;
*)
# echo "Usage: $0 {start|stop|restart}" >&2
display_help
exit 1
;;
esac
यह थोड़ा अजीब है कि मैंने एक अलग मामले में स्टार्ट स्टॉप रिस्टार्ट रखा, लेकिन यह काम करना चाहिए
if
यदि आपके पास जाँच करने के लिए केवल एक ही विकल्प है और यह हमेशा पहला विकल्प ( $1
) होगा तो सबसे सरल समाधान if
एक परीक्षण ( [
) के साथ है। उदाहरण के लिए:
if [ "$1" == "-h" ] ; then
echo "Usage: `basename $0` [-h]"
exit 0
fi
ध्यान दें कि पॉज़िक्स संगतता के लिए =
भी काम करेगा ==
।
$1
?$1
उद्धरणों में संलग्न होने का कारण यह है कि यदि कोई नहीं है, $1
तो शेल चलाने की कोशिश करेगा if [ == "-h" ]
और विफल हो जाएगा क्योंकि ==
केवल एक ही तर्क दिया गया है जब यह दो की उम्मीद कर रहा था:
$ [ == "-h" ]
bash: [: ==: unary operator expected
getopt
याgetopts
जैसा कि दूसरों ने सुझाव दिया है , यदि आपके पास एक से अधिक सरल विकल्प हैं, या किसी तर्क को स्वीकार करने के लिए आपके विकल्प की आवश्यकता है, तो आपको निश्चित रूप से उपयोग करने की अतिरिक्त जटिलता के लिए जाना चाहिए ।getopts
एक त्वरित संदर्भ के रूप में, मुझे 60 सेकंड का गेटटॉप ट्यूटोरियल पसंद है । †
आप getopt
अंतर्निहित शेल के बजाय कार्यक्रम पर विचार करना चाह सकते हैं getopts
। यह लंबे समय से विकल्प के उपयोग की अनुमति देता है, और विकल्प के बाद गैर विकल्प तर्क (जैसे foo a b c --verbose
बल्कि सिर्फ तुलना में foo -v a b c
)। यह Stackoverflow जवाब बताता है कि GNU का उपयोग कैसे किया जाता है getopt
।
† jeffbyrnes उल्लेख किया है कि मूल लिंक की मृत्यु हो गई, लेकिन शुक्र है जिस तरह से वापस मशीन उसे संग्रहीत कर दिया था।
बैश की सुविधा का उपयोग करने के लिए बेहतर है। कृपया इस Q & A को और अधिक सहायता के लिए देखें: लंबे और छोटे कमांड लाइन विकल्प प्राप्त करने के लिए bash शेल स्क्रिप्ट में getopts का उपयोग करना
मुझे लगता है कि आप इसके लिए मामले का उपयोग कर सकते हैं ...
case $1 in
-h) echo $usage ;;
h) echo $usage ;;
help) echo $usage ;;
esac