आप भ्रम से पीड़ित हैं; getopts
का उपयोग करके ध्वज पत्र द्वारा उपसर्ग किए गए अनिवार्य तर्कों की आवश्यकता नहीं होती है। मैंने स्क्रिप्ट के अपने कॉर्पस से एक उपयुक्त उदाहरण खोजने की कोशिश की; यह एक अर्द्ध सभ्य अनुमान है। इसे rcsunco
कहा जाता है और इसका उपयोग आरसीएस से चेकआउट रद्द करने के लिए किया जाता है। मैंने इसे थोड़ी देर में संशोधित नहीं किया है, मैं देखता हूं; मैं इसे अक्सर इस्तेमाल करता हूं (क्योंकि मैं आरसीएस से पूरी तरह से माइग्रेट नहीं हुआ हूं)।
#!/bin/sh
#
# "@(#)$Id: rcsunco.sh,v 2.1 2002/08/03 07:41:00 jleffler Exp $"
#
# Cancel RCS checkout
# -V print version number
# -n do not remove or rename checked out file (like SCCS unget) (default)
# -r remove checked out file (default)
# -k keep checked out file as $file.keep
# -g checkout (unlocked) file after clean-up
# -q quiet checkout
: ${RCS:=rcs}
: ${CO:=co}
remove=yes
keep=no
get=no
quiet=
while getopts gknqrV opt
do
case $opt in
V) echo "`basename $0 .sh`: RCSUNCO Version $Revision: 2.1 $ ($Date: 2002/08/03 07:41:00 $)" |
rcsmunger
exit 0;;
g) get=yes;;
k) keep=yes;;
n) remove=no;;
q) quiet=-q;;
r) remove=yes;;
*) echo "Usage: `basename $0 .sh` [-{n|g}][-{r|k}] file [...]" 1>&2
exit 1;;
esac
done
shift $(($OPTIND-1))
for file in $*
do
rfile=$(rfile $file)
xfile=$(xfile $rfile)
if $RCS -u $rfile
then
if [ $keep = yes ]
then
if [ -f $xfile ]
then
mv $xfile $xfile.keep
echo "$xfile saved in $xfile.keep"
fi
elif [ $remove = yes ]
then rm -f $xfile
fi
if [ $get = yes ] && [ $remove = yes -o $keep = yes ]
then $CO $quiet $rfile
fi
fi
done
यह केवल अर्ध-सभ्य अनुमान है; यदि आप वैकल्पिक तर्कों के बाद कोई फ़ाइल नाम नहीं देते हैं तो स्क्रिप्ट चुपचाप कुछ भी नहीं करती है। हालांकि, अगर आपको इसकी आवश्यकता है, तो आप जांच सकते हैं कि 'शिफ्ट' के बाद अनिवार्य तर्क मौजूद हैं। मेरी एक और लिपि में अनिवार्य तर्क हैं। यह शामिल हैं:
...
shift $(($OPTIND - 1))
case $# in
2) case $1 in
install) MODE=Installation;;
uninstall) MODE=Uninstallation;;
*) usage;;
esac;;
*) usage;;
esac
तो, कि आदेश (jlss
) इस तरह के -d $HOME
के रूप में वैकल्पिक तर्क ले जा सकते हैं, लेकिन या तो install
या uninstall
कुछ स्थापित करने के लिए के नाम के बाद की आवश्यकता है। उपयोग की बुनियादी मोड है:
jlss install program
लेकिन वैकल्पिक विधा है:
jlss -d $HOME -u me -g mine -x -p install program
क्योंकि यह बारे में 12 विकल्प हैं मैं jlss
के सभी दिखाई नहीं दिया है - यह नहीं rcsunco
के रूप में के रूप में कॉम्पैक्ट है ।
आप विकल्प तर्कों से पहले अनिवार्य तर्क के साथ काम कर रहे थे, तो आप थोड़ा और काम करने के लिए होगा:
- आप अनिवार्य तर्क लेने चाहते हैं, उनमें से बाहर स्थानांतरण मार्ग।
- फिर आप झंडे के साथ वैकल्पिक तर्कों को संसाधित करते हैं।
- अंत में, यदि उपयुक्त हो, तो आप अतिरिक्त 'फ़ाइल नाम' तर्कों को संभाल लेंगे।
यदि आप विकल्प तर्क (अनिवार्य दोनों के पहले और बाद में) के साथ अनिवार्य तर्कों से निपट रहे हैं, तो आपके पास अभी भी और अधिक काम है। इसका उपयोग कई वीसीएस सिस्टम द्वारा किया जाता है; सीवीएस और Git दोनों सुविधा है:
git -global option command [-sub option] [...]
यहाँ, आप वैश्विक विकल्प प्राप्त करने के एक getopts
पाश चलाने; अनिवार्य तर्क उठाओ; और सब-विकल्प प्राप्त करने के लिए दूसरा getopts
पाश चलाएं (और शायद 'फ़ाइल नाम' तर्कों पर अंतिम लूप चलाएं)।
जीवन मजेदार नहीं है?
ऐसा लगता है कि यह वही है जो मैं चाहता हूं। इसके साथ एक सवाल, हालांकि: अगर मैं एक ध्वज की अनुमति देना चाहता हूं जो तर्क लेता है (उदाहरण के लिए, -l file.txt), वाक्यविन्यास क्या होगा? एक बार फिर धन्यवाद। –
इसके लिए गेटोपट मैन पेज से परामर्श लें। संक्षेप में: विकल्प में एक कोलन संलग्न करें (उदा। '" -rv: x "', जिसके लिए तर्क लेने के लिए वी की आवश्यकता होती है)। लंबे विकल्प भी समर्थित हैं, जो एक तरह से गेटोपेट्स को निर्मित करता है। ध्यान दें कि आपको अतिरिक्त गैर-विकल्प तर्क स्वयं को संभालना होगा। – Sorpigal
आपको बहुत बहुत धन्यवाद। एक उत्कृष्ट प्रतिक्रिया। –