मैं एक शेल स्क्रिप्ट में कमांड लाइन तर्क कैसे पारित कर सकता हूं?


241

मुझे पता है कि शेल स्क्रिप्ट केवल कमांड चलाती हैं जैसे कि उन्हें कमांड प्रॉम्प्ट पर निष्पादित किया गया था। मैं शेल स्क्रिप्ट को चलाने में सक्षम होना चाहता हूं जैसे कि वे फ़ंक्शन थे ... अर्थात, स्क्रिप्ट में इनपुट मान या स्ट्रिंग लेना। मैं ऐसा करने के लिए कैसे संपर्क करूं?

जवाबों:


198

शेल कमांड और उस कमांड के किसी भी तर्क को गिने हुए शेल वैरिएबल के रूप में दिखाई देते हैं : $0कमांड का स्ट्रिंग मान ही कुछ है script, जैसे ./script, /home/user/bin/scriptया जो भी हो। किसी भी तर्क के रूप में प्रकट "$1", "$2", "$3"और इतने पर। तर्कों की गिनती शेल चर में होती है "$#"

इससे निपटने के सामान्य तरीके शेल कमांड getoptsऔर शामिल हैं shiftgetoptsबहुत सी getopt()लाइब्रेरी फ़ंक्शन की तरह है। shiftमूल्‍य $2को $1, $3से $2, वगैरह पर ले जाता है; $#सड़ जाता है। कोड एक मूल्य का "$1"उपयोग करके चीजों को देख कर समाप्त होता है case... esacएक कार्रवाई पर निर्णय लेने के लिए, और फिर अगले तर्क shiftपर जाने के $1लिए। यह केवल कभी जांच करना है $1, और शायद $#


6
C getopt()एक अत्यंत स्थापित मानक है, लेकिन getoptनिष्पादन योग्य डिस्ट्रो / प्लेटफॉर्म पर समान नहीं है। मैं अब पूरी तरह से परिवर्तित getoptsउपयोगकर्ता हूँ , क्योंकि यह एक POSIX मानक है। यह dashभी बहुत अच्छा काम करता है , जो मेरी पसंदीदा स्क्रिप्ट शेल है
जेएम बेकर

164

आप के साथ पारित एक्सेस कर सकते हैं तर्क $nजहां nतर्क का क्रमांक है - 1, 2, 3, ...। आप वैसे ही तर्क पास करते हैं जैसे आप किसी अन्य कमांड के साथ करेंगे।

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world

27
$/shellscriptname.sh argument1 argument2 argument3 

आप किसी अन्य शेल स्क्रिप्ट के तर्क के रूप में एक शेल स्क्रिप्ट का आउटपुट भी पास कर सकते हैं।

$/shellscriptname.sh "$(secondshellscriptname.sh)"

शेल स्क्रिप्ट के भीतर आप संख्याओं के साथ तर्कों का उपयोग कर सकते हैं जैसे $1पहले तर्क के लिए और $2दूसरे तर्क के लिए और इसी तरह आगे।

शेल तर्क पर अधिक


18

फार्म

$ ./script.sh "$@" 

के लिए सबसे सुविधाजनक है argv। Arg सीमांकक व्हॉट्सएप है, लेकिन इसे बदला जा सकता है। याद नहीं कैसे बंद हाथ। फिर उपयोग करें

 $1, $2, shift, if [ $# -ne 3 ] 

प्रवाह को नियंत्रित करने के लिए। मैं आम तौर पर getopts गले नहीं case ... esacहोगा अगर एक पर्याप्त होगा।


14

बैश स्क्रिप्ट पर, मैं व्यक्तिगत रूप से पैरामीटर सेट करने के लिए निम्न स्क्रिप्ट का उपयोग करना पसंद करता हूं:

#!/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


5

शेल स्क्रिप्ट में; यह चर नाम $ 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 पर पाया जाता है


2
U & L में आपका स्वागत है, यह पहले से दिए गए उत्तर के लिए कुछ भी मुश्किल से जोड़ता है।
अर्चनाकर

1

यदि आप पाइथन ऑर्गपर्स से परिचित हैं, और बैश आर्ग्युमेंट्स को पार्स करने के लिए पाइथन को कॉल करने में कोई आपत्ति नहीं है, तो बैश अर्गपर्स ( https://github.com/mattbryson/bash-arg-parse ) का उपयोग करें ,

यहाँ देखें वही उत्तर: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287


0
#!/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

3
1) अनावश्यक 2> /dev/null, 2) मौजूदा उत्तरों में कुछ भी नहीं जोड़ता है।
जेनॉइड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.