गुजर रहा निम्नलिखित लाइनों (उम्मीद है कि इस सबसे अच्छा अभ्यास है, तो मुझे सही नहीं है कृपया) कमांड लाइन विकल्पों को संभालने के लिए उपयोग करें:बैश - getopts - कमांड लाइन तर्क में बड़े पैमाने पर बहस (ऑपरेंड) पहले स्थान पर
#!/usr/bin/bash
read -r -d '' HELP <<EOF
OPTIONS:
-c Enable color output
-d Enable debug output
-v Enable verbose output
-n Only download files (mutually exclusive with -r)
-r Only remove files (mutually exclusive with -n)
-h Display this help
EOF
# DECLARE VARIABLES WITH DEFAULT VALUES
color=0
debug=0
verbose=0
download=0
remove=0
OPTIND=1 # Reset in case getopts has been used previously in the shell
invalid_options=(); # Array for invalid options
while getopts ":cdvnrh" opt; do
echo "Actual opt: $opt"
case $opt in
c)
color=1
;;
d)
debug=1
;;
v)
verbose=1
;;
n)
download=1
;;
r)
remove=1
;;
h)
echo "$HELP"
exit 1
;;
\?)
invalid_options+=($OPTARG)
;;
*)
invalid_options+=($OPTARG)
;;
esac
done
# HANDLE INVALID OPTIONS
if [ ${#invalid_options[@]} -ne 0 ]; then
echo "Invalid option(s):" >&2
for i in "${invalid_options[@]}"; do
echo $i >&2
done
echo "" >&2
echo "$HELP" >&2
exit 1
fi
# SET $1 TO FIRST MASS ARGUMENT, $2 TO SECOND MASS ARGUMENT ETC
shift $((OPTIND - 1))
# HANDLE CORRECT NUMBER OF MASS OPTIONS
if [ $# -ne 2 ]; then
echo "Correct number of mass arguments are 2"
echo "" >&2
echo "$HELP" >&2
exit 1
fi
# HANDLE MUTUALLY EXCLUSIVE OPTIONS
if [ $download -eq 1 ] && [ $remove -eq 1 ]; then
echo "Options for download and remove are mutually exclusive" >&2
echo "$HELP" >&2
exit 1
fi
echo "color: $color"
echo "debug: $debug"
echo "verbose: $verbose"
echo "download: $download"
echo "remove: $remove"
echo "\$1: $1"
echo "\$2: $2"
हैं मैं स्क्रिप्ट रास्ता फोन कि mass arguments (उन है कि स्विच या तर्क स्विच के लिए नहीं कर रहे हैं) पिछले तर्क सब कुछ सही ढंग से काम कर रहा है कर रहे हैं:
$ ./getopts.sh -c -d -v -r a b
Actual opt: c
Actual opt: d
Actual opt: v
Actual opt: r
color: 1
debug: 1
verbose: 1
download: 0
remove: 1
$1: a
$2: b
समस्या है जब मैं बहुत बड़े पैमाने पर बहस पहले स्थान पर है स्क्रिप्ट कॉल करना चाहते हैं (या कहीं स्विच के बीच में डी ओ तर्क का उपयोग नहीं)
$ ./getopts.sh a b -c -d -v -r
Correct number of mass arguments are 2
OPTIONS:
-c Enable color output
-d Enable debug output
-v Enable verbose output
-n Only download files (mutually exclusive with -r)
-r Only remove files (mutually exclusive with -d)
-h Display this help
या
$ ./getopts.sh -c a b -d -v -r
Actual opt: c
Correct number of mass arguments are 2
OPTIONS:
-c Enable color output
-d Enable debug output
-v Enable verbose output
-n Only download files (mutually exclusive with -r)
-r Only remove files (mutually exclusive with -d)
-h Display this help
मुझे लगता है कि इस अनुसार ठीक होना चाहिए (इसे POSIX) मानकों, क्योंकि निम्न सिंटैक्स जो मूल रूप से एक ही अपने सिस्टम पर अपेक्षानुसार कार्य कर रही है:
$ cp test1/ test2/ -r
$ cp test1/ -r test2/
मैं इंटरनेट लेकिन केवल बात यह है कि मेरी समस्या के करीब this one सी
से संबंधित था था पर खोज की है
आपके अवलोकन सही हैं: पहली गैर-विकल्प तर्क का सामना करने पर गेटोपेट्स बाहर निकलने की स्थिति लौटाता है, इसलिए जबकि-लूप समाप्त होता है। मेरा मानना है कि ['getopt'] (http://man.cx/getopt) आपके इच्छित अधिक लचीले तरीके से काम कर सकता है। –
@glennjackman getopt पर getopts का उपयोग करने के लिए सिफारिशें हैं। AFAIK Getopt अप्रचलित माना जाता है। –
मुझे विश्वास नहीं है कि Getopt अप्रचलित माना जाता है। गेटोपेट्स का उपयोग करना आसान है (आईएमओ: यह वही है जो मैं उपयोग करता हूं) लेकिन यह आपको आवश्यक पैरामीटर से पहले विकल्पों को रखने के लिए मजबूर करता है और आप - longoptions का उपयोग नहीं कर सकते हैं। –