2010-08-20 13 views
32

तो मेरा सवाल यह है कि मैं लिनक्स में टर्मिनल कमांड का उपयोग करके अपनी बैश स्क्रिप्ट में फ़ाइल तर्क कैसे पास कर सकता हूं? फिलहाल मैं बैश में एक प्रोग्राम बनाने की कोशिश कर रहा हूं जो टर्मिनल से फ़ाइल तर्क ले सकता है और इसे मेरे प्रोग्राम में एक चर के रूप में उपयोग कर सकता है। उदाहरण के लिए मैं टर्मिनल में myprogram --file=/path/to/file चलाता हूं।लिनक्स में टर्मिनल कमांड का उपयोग करके मैं अपनी बैश स्क्रिप्ट में फ़ाइल तर्क कैसे पास कर सकता हूं?

मेरे कार्यक्रम

#!/bin/bash  
File=(the path from the argument) 
externalprogram $File (other parameters) 

मैं कैसे यह मेरी कार्यक्रम के साथ प्राप्त कर सकते हैं?

उत्तर

42

यह आसान होगा (और अधिक "उचित", नीचे देखें) अगर आप सिर्फ

myprogram /path/to/file 

तो फिर तुम पथ स्क्रिप्ट के भीतर $1 के रूप में (# 1 तर्क के लिए उपयोग कर सकते हैं के रूप में अपनी स्क्रिप्ट चलाने, इसी तरह $2 # तर्क 2, आदि) है

file="$1" 
externalprogram "$file" [other parameters] 

या बस

externalprogram "$1" [otherparameters] 

यदि आप --file=/path/to/file जैसे किसी चीज़ से पथ निकालना चाहते हैं, तो आमतौर पर getopts शैल फ़ंक्शन के साथ किया जाता है। लेकिन यह $1 का संदर्भ देने से कहीं अधिक जटिल है, और इसके अलावा, --file= जैसे स्विच वैकल्पिक होने का इरादा रखते हैं। मैं आपकी स्क्रिप्ट का अनुमान लगा रहा हूं को एक फ़ाइल नाम प्रदान करने की आवश्यकता है, इसलिए इसे विकल्प में पास करने का अर्थ नहीं है।

+3

ध्यान दें कि सभी पैरामीटर विस्तार '$ फ़ाइल' सहित उद्धृत किया जाना है। – Philipp

+0

क्या --file विधि को लागू करने का कोई तरीका है? मैं ऐसा करना चाहता हूं क्योंकि अगर यह बिना किसी तर्क के चलाया जाता है, तो प्रोग्राम उपयोगकर्ता से पूछ सकता है कि कौन सी फ़ाइल चुनी जानी चाहिए। यह इस तरह से प्रोग्राम को व्यवस्थित करेगा। – AZorin

+2

आमतौर पर आप जांचते हैं कि उपयोगकर्ता ने फ़ाइल नाम प्रदान किया है (पैरामीटर '#' में स्थितित्मक तर्कों की संख्या शामिल है), और यदि कोई फ़ाइल या '-' दिया गया तो मानक इनपुट का उपयोग करें। यदि आप '--file =' वाक्यविन्यास चाहते हैं, तो 'केस' कथन का उपयोग करें। – Philipp

7

बैश "पोजिशनल पैरामीटर्स" नामक अवधारणा का समर्थन करता है। ये स्थितित्मक पैरामीटर तर्क प्रस्तुत करते हैं जो कमांड लाइन पर निर्दिष्ट होते हैं जब बैश स्क्रिप्ट का आह्वान किया जाता है।

स्थितीय मापदंडों इतने पर नाम $0, $1, $2 से जाने जाते हैं ... और। $0 स्क्रिप्ट का नाम है, $1 स्क्रिप्ट के लिए पहला तर्क है, $2 दूसरा, आदि $*$0 (यानी $1 से शुरू) को छोड़कर सभी स्थितित्मक पैरामीटर का प्रतिनिधित्व करता है।

एक उदाहरण:

#!/bin/bash 
FILE="$1" 
externalprogram "$FILE" <other-parameters> 
+1

' $ FILE' उद्धृत किया जाना चाहिए। – Philipp

+2

हां, आप सही हैं, इस मामले में जहां हम '$ 1' को फ़ाइल नाम रखने की उम्मीद करते हैं, इसे शब्द विभाजन से बचने के लिए उद्धृत किया जाना चाहिए, फ़ाइल नाम में एक या अधिक रिक्त स्थान होना चाहिए। लेकिन स्थितित्मक मानकों को उद्धृत कर रहा है * हमेशा * आवश्यक? –

+0

मुझे लगता है कि यह अनुमान लगाने के मुकाबले सभी चरों को हमेशा उद्धृत करना आसान है कि उन्हें उद्धरण होना चाहिए या नहीं। पोजिशनल तर्क उपयोगकर्ता इनपुट होते हैं, और उपयोगकर्ता कुछ भी दर्ज कर सकते हैं, इसलिए जब तक कि यह दस्तावेज नहीं किया जाता है कि एक तर्क शब्द विभाजन से गुजरता है, इसे उद्धृत किया जाना चाहिए। तकनीकी रूप से, चर को '=' के बाद और [[...]] 'के भीतर उद्धृत करने की आवश्यकता नहीं है, लेकिन फिर यह याद रखना आसान है कि शब्द विभाजन क्यों नहीं किया जाता है। – Philipp

2

मान लिया जाये कि आप डेविड Zaslavsky पता चलता है के रूप में है, ताकि पहले तर्क बस है (कोई विकल्प-पार्सिंग) की आवश्यकता को चलाने के लिए कार्यक्रम करते हैं, आप सवाल के साथ काम कर रहे हैं तर्क 2 और अपने बाहरी कार्यक्रम पर कैसे पास करें। ! यहाँ एक सुविधाजनक तरीका बताया गया है:।

#!/bin/bash 
ext_program="$1" 
shift 
"$ext_program" "[email protected]" 

shift, पहला तर्क निकाल देंगे बाकी ($2 हो जाता है $1, and so on). $ @ `शब्द की एक सरणी (यह कहते हुए उद्धृत किया जाना चाहिए) के रूप में, तर्क को संदर्भित करता है नाम बदलने

यदि आपके पास --file वाक्यविन्यास होना चाहिए (उदाहरण के लिए, यदि कोई डिफ़ॉल्ट प्रोग्राम चलाने के लिए है, तो उपयोगकर्ता को एक को आपूर्ति करने की आवश्यकता नहीं है), ext_program="$1" को $1 के जो भी पार्सिंग के साथ प्रतिस्थापित करें, शायद आपको getopt का उपयोग करने की ज़रूरत है या गेटोपेट्स।

आप बस एक विशेष मामले के लिए, अपने खुद के रोल करना चाहते हैं, तो आप कुछ इस तरह कर सकता है:

if [ "$#" -gt 0 -a "${1:0:6}" == "--file" ]; then 
    ext_program="${1:7}" 
else 
    ext_program="default program" 
fi 
+0

+1। लेकिन न तो 'getopt' और न ही 'getopts' जीएनयू शैली तर्कों का विश्लेषण कर सकते हैं। – Philipp

+0

@ फिलिप: गेटोपेट्स नहीं कर सकते हैं, लेकिन निश्चित रूप से मेरे सिस्टम पर, निश्चित रूप से प्राप्त कर सकते हैं। संभवतः यह तथ्य इस तथ्य से आता है कि सी समारोह 'गेटोपेट' का जीएनयू और गैर-जीएनयू संस्करण दोनों है। – Cascabel

17

आप अपने bash लिपि में मानकों को संभालने के लिए getopt का उपयोग कर सकते हैं। वहां बाहर निकलने के लिए कई स्पष्टीकरण नहीं हैं।

#!/bin/sh 

OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "[email protected]") 

if [ $? -ne 0 ]; then 
    echo "getopt error" 
    exit 1 
fi 

eval set -- $OPTIONS 

while true; do 
    case "$1" in 
    -h|--help) HELP=1 ;; 
    -f|--file) FILE="$2" ; shift ;; 
    -g|--foo) FOO=1 ;; 
    -b|--bar) BAR=1 ;; 
    --)  shift ; break ;; 
    *)   echo "unknown option: $1" ; exit 1 ;; 
    esac 
    shift 
done 

if [ $# -ne 0 ]; then 
    echo "unknown option(s): [email protected]" 
    exit 1 
fi 

echo "help: $HELP" 
echo "file: $FILE" 
echo "foo: $FOO" 
echo "bar: $BAR" 

यह भी देखें:: यहाँ एक उदाहरण है

+1

... महान स्पष्टीकरण – Jonathan

संबंधित मुद्दे

 संबंधित मुद्दे