जवाबों:
शेल कमांड और उस कमांड के किसी भी तर्क को गिने हुए शेल वैरिएबल के रूप में दिखाई देते हैं : $0
कमांड का स्ट्रिंग मान ही कुछ है script
, जैसे ./script
, /home/user/bin/script
या जो भी हो। किसी भी तर्क के रूप में प्रकट "$1"
, "$2"
, "$3"
और इतने पर। तर्कों की गिनती शेल चर में होती है "$#"
।
इससे निपटने के सामान्य तरीके शेल कमांड getopts
और शामिल हैं shift
। getopts
बहुत सी getopt()
लाइब्रेरी फ़ंक्शन की तरह है। shift
मूल्य $2
को $1
, $3
से $2
, वगैरह पर ले जाता है; $#
सड़ जाता है। कोड एक मूल्य का "$1"
उपयोग करके चीजों को देख कर समाप्त होता है case
... esac
एक कार्रवाई पर निर्णय लेने के लिए, और फिर अगले तर्क shift
पर जाने के $1
लिए। यह केवल कभी जांच करना है $1
, और शायद $#
।
$/shellscriptname.sh argument1 argument2 argument3
आप किसी अन्य शेल स्क्रिप्ट के तर्क के रूप में एक शेल स्क्रिप्ट का आउटपुट भी पास कर सकते हैं।
$/shellscriptname.sh "$(secondshellscriptname.sh)"
शेल स्क्रिप्ट के भीतर आप संख्याओं के साथ तर्कों का उपयोग कर सकते हैं जैसे $1
पहले तर्क के लिए और $2
दूसरे तर्क के लिए और इसी तरह आगे।
फार्म
$ ./script.sh "$@"
के लिए सबसे सुविधाजनक है argv
। Arg सीमांकक व्हॉट्सएप है, लेकिन इसे बदला जा सकता है। याद नहीं कैसे बंद हाथ। फिर उपयोग करें
$1, $2, shift, if [ $# -ne 3 ]
प्रवाह को नियंत्रित करने के लिए। मैं आम तौर पर getopts गले नहीं case ... esac
होगा अगर एक पर्याप्त होगा।
बैश स्क्रिप्ट पर, मैं व्यक्तिगत रूप से पैरामीटर सेट करने के लिए निम्न स्क्रिप्ट का उपयोग करना पसंद करता हूं:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
इस संरचना के साथ, हम मापदंडों के क्रम पर भरोसा नहीं करते हैं, क्योंकि हम उनमें से हर एक को एक महत्वपूर्ण पत्र परिभाषित कर रहे हैं। साथ ही, मदद फ़ंक्शन को हर समय मुद्रित किया जाएगा जो कि मापदंडों को गलत तरीके से परिभाषित किया गया है। यह बहुत उपयोगी है जब हमारे पास संभालने के लिए विभिन्न मापदंडों के साथ बहुत सारी स्क्रिप्ट हैं। यह निम्नलिखित के रूप में काम करता है:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
शेल स्क्रिप्ट में; यह चर नाम $ 1 हो जाता है। दूसरा शब्द चर नाम $ 2 और इसी तरह हो जाता है।
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
अधिक शायद शेल (श) मैनुअल में http://heirloom.sourceforge.net/sh/sh.1.html पर पाया जाता है
यदि आप पाइथन ऑर्गपर्स से परिचित हैं, और बैश आर्ग्युमेंट्स को पार्स करने के लिए पाइथन को कॉल करने में कोई आपत्ति नहीं है, तो बैश अर्गपर्स ( https://github.com/mattbryson/bash-arg-parse ) का उपयोग करें ,
यहाँ देखें वही उत्तर: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
, 2) मौजूदा उत्तरों में कुछ भी नहीं जोड़ता है।
getopt()
एक अत्यंत स्थापित मानक है, लेकिनgetopt
निष्पादन योग्य डिस्ट्रो / प्लेटफॉर्म पर समान नहीं है। मैं अब पूरी तरह से परिवर्तितgetopts
उपयोगकर्ता हूँ , क्योंकि यह एक POSIX मानक है। यहdash
भी बहुत अच्छा काम करता है , जो मेरी पसंदीदा स्क्रिप्ट शेल है