बैश में स्क्रिप्ट पैरामीटर


103

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

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

इसके बाद स्क्रिप्ट ocr छवि फ़ाइल को टेक्स्ट फ़ाइल में बदल देगी। यहाँ मैं अब तक के साथ आया हूँ:

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

लेकिन मैं नहीं जानता कि कैसे -fromऔर -toमूल्यों को प्राप्त करने के लिए । यह कैसे करना है पर कोई विचार?


जवाबों:


124

तर्क है कि आप एक bashscript को प्रदान चर में दिखाई देगा $1और $2और $3जहां संख्या तर्क को दर्शाता है। $0आज्ञा ही है।

तर्कों को रिक्त स्थान द्वारा अलग किया जाता है, इसलिए यदि आप कमांड में -fromऔर प्रदान करेंगे, तो -toवे इन चर में भी समाप्त हो जाएंगे, इसलिए इसके लिए:

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

आपको मिलेगा:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

यह न करने का आसान हो सकता है -fromऔर -to, जैसे:

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

तब आपके पास होगा:

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

नकारात्मक पक्ष यह है कि आपको इसे सही क्रम में आपूर्ति करना होगा। ऐसी लाइब्रेरी हैं जो कमांड लाइन पर तर्कों को नामित करने के लिए आसान बना सकती हैं, लेकिन आमतौर पर सरल शेल स्क्रिप्ट के लिए आपको बस आसान तरीके का उपयोग करना चाहिए, अगर यह कोई समस्या नहीं है।

तो आप कर सकते हैं:

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

को दोहरे उद्धरण चिह्नों $1और $2हमेशा जरूरी नहीं हैं, लेकिन, सलाह दी रहे हैं, क्योंकि कुछ तार यदि आप उन्हें दोहरे उद्धरण चिह्नों के बीच डाल नहीं काम नहीं करेगा।


69

यदि आप अपने विकल्प नामों के रूप में "से" और "से" का उपयोग करने के लिए पूरी तरह से संलग्न नहीं हैं, तो गेटटॉप का उपयोग करके इसे लागू करना काफी आसान है :

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts एक प्रोग्राम है जो कमांड लाइन के तर्कों को प्रोसेस करता है और आसानी से आपके लिए उन्हें पार्स करता है।

f:t:निर्दिष्ट करता है कि आप उन 2 मापदंडों की अपेक्षा कर रहे हैं जिनमें मान शामिल हैं (बृहदान्त्र द्वारा इंगित)। ऐसा कुछ f:t:vकहता है कि -vकेवल एक ध्वज के रूप में व्याख्या की जाएगी।

optsवह जगह है जहां वर्तमान पैरामीटर संग्रहीत है। caseबयान जहाँ आप इस पर कार्रवाई करेंगे है।

${OPTARG}पैरामीटर के बाद मान होता है। ${FROM_VAL}उदाहरण के लिए मान मिलेगा /home/kristoffer/test.pngयदि आपने अपनी स्क्रिप्ट को चलाया:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

जैसा कि अन्य लोग सुझाव दे रहे हैं, यदि यह आपका पहली बार बैश स्क्रिप्ट लिखने का है तो आपको कुछ मूल बातें पढ़नी चाहिए। यह कैसे getoptsकाम करता है पर एक त्वरित ट्यूटोरियल था ।


1
यह एक पठनीय समाधान प्रतीत होता है। फिर आप दो झंडे कैसे निर्दिष्ट करेंगे?
ज़ेल्फिर कलस्टहल

@Zelphir, आप दो या अधिक झंडे निर्दिष्ट कर सकते हैं, झंडे के बाद ":"। मिसाल के तौर पर f:t:vsकिया जाएगा-f some_f -t some_t -v -s
h_s

34

चरों का उपयोग करें "$1", "$2", "$3"और पर तो पहुंच तर्कों को। उन सभी तक पहुँचने के लिए "$@", जिनका आप उपयोग कर सकते हैं , या तर्कों की गिनती प्राप्त करने के लिए $#(बहुत कम या बहुत अधिक तर्कों के लिए जाँच करना उपयोगी हो सकता है)।


24

मुझे यह सुनिश्चित करने की ज़रूरत थी कि मेरी स्क्रिप्ट पूरी तरह से विभिन्न मशीनों, गोले और यहां तक ​​कि साइबर संस्करणों के बीच पोर्टेबल हैं। इसके अलावा, मेरे सहकर्मी जो मेरे लिए स्क्रिप्ट लिखने के लिए थे, वे प्रोग्रामर हैं, इसलिए मैंने इसका उपयोग करना समाप्त कर दिया:

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-s" ] 
    then ((i++)) 
        var1=${!i};

    elif [ ${!i} = "-log" ];
    then ((i++)) 
        logFile=${!i};  

    elif [ ${!i} = "-x" ];
    then ((i++)) 
        var2=${!i};    

    elif [ ${!i} = "-p" ]; 
    then ((i++)) 
        var3=${!i};

    elif [ ${!i} = "-b" ];
    then ((i++)) 
        var4=${!i};

    elif [ ${!i} = "-l" ];
    then ((i++)) 
        var5=${!i}; 

    elif [ ${!i} = "-a" ];
    then ((i++)) 
        var6=${!i};
    fi

done;

Rationale: मैंने एक launcher.shस्क्रिप्ट भी शामिल की है , क्योंकि पूरे ऑपरेशन में कई चरण थे जो एक दूसरे पर स्वतंत्र थे (मैं "quasi" कह रहा हूं, क्योंकि भले ही प्रत्येक स्क्रिप्ट को अपने आप चलाया जा सकता था, वे आमतौर पर सभी एक साथ चलते थे ), और दो दिनों में मुझे पता चला कि, मेरे लगभग आधे सहकर्मी, प्रोग्रामर और सभी होने के नाते, लॉन्चर फ़ाइल का उपयोग करने के लिए बहुत अच्छे थे, "उपयोग" का पालन करें, या मदद पढ़ें जो कि हर बार कुछ किए जाने पर प्रदर्शित होता था गलत है और वे पूरे मामले की गड़बड़ी कर रहे थे, गलत क्रम में तर्कों के साथ स्क्रिप्ट चला रहे थे और शिकायत कर रहे थे कि स्क्रिप्ट ठीक से काम नहीं कर रहे हैं। मैं जो चोलरी हूं वह होने के नाते मैंने यह सुनिश्चित करने के लिए अपनी सभी लिपियों को ओवरहाल करने का फैसला किया कि वे सहयोगी-प्रूफ हैं। उपरोक्त कोड खंड पहली बात थी।


2
यह मुझे पंसद है। मैं अंत में एक अनुभाग जोड़ रहा हूं 'अन्य प्रतिध्वनि "अमान्य तर्क: $ {! I}" (((i ++))
Fi`

6

बैश $1में स्क्रिप्ट के लिए दिया गया पहला तर्क है, $2दूसरा और इसी तरह

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

तो आप उपयोग कर सकते हैं:

./your_script.sh some_source_file.png destination_file.txt

दोहरे उद्धरणों पर स्पष्टीकरण;

तीन लिपियों पर विचार करें:

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

अब आह्वान करें:

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

जब आप आह्वान करते हैं foo.sh "a b"तो यह bar.sh a b(दो तर्क) foo2.sh "a b"आह्वान करता है , और इसके साथ bar.sh "a b"(1 तर्क) आह्वान करता है । हमेशा ध्यान रखें कि कैसे मापदंडों को पारित किया जाता है और बैश में विस्तार किया जाता है, यह आपको बहुत सिरदर्द से बचाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.