2012-04-24 19 views
22

मैं एक शेल स्क्रिप्ट के माध्यम से gs (भूतस्क्रिप्ट) पर कॉल का एक सरल संक्षेप परिभाषित करना चाहता हूं। पहला तर्क उन सभी फ़ाइलों को देता है जिन्हें विलय किया जाना चाहिए, अंतिम व्यक्ति आउटपुट फ़ाइल का नाम देता है। जाहिर है, निम्नलिखित काम नहीं करता है (यह केवल लक्ष्य दिखाने के लिए है):तर्कों की चर संख्या के साथ एक खोल स्क्रिप्ट को परिभाषित करने के लिए कैसे?

#!/bin/sh 
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$last $1 $2 ... 

यह कैसे किया जा सकता है?

कोई आमतौर पर myscript infile1.pdf infile2.pdf ... outfile.pdf या myscript *.pdf outfile.pdf के माध्यम से इस स्क्रिप्ट को कॉल करेगा।

उत्तर

34

बैश चर [email protected] और $* कमांड लाइन तर्कों की सूची में विस्तारित करें। आम तौर पर, आप "[email protected]" (यानी [email protected] डबल कोट्स से घिरा हुआ) का उपयोग करना चाहेंगे। यह सही काम करेगा यदि कोई आपकी स्क्रिप्ट को व्हाइटस्पेस वाले तर्क को पास करता है।

तो आप अपनी स्क्रिप्ट में इस था:

outputfile=$1 
shift 
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$outputfile "[email protected]" 

और तुम कहा जाता है इस तरह अपनी स्क्रिप्ट:

myscript out.pdf foo.ps bar.ps "another file.ps" 

यह विस्तार होगा:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=out.pdf foo.ps bar.ps "another file.ps" 

"Special Parameters" पढ़ें अधिक जानकारी के लिए bash मैन पेज का अनुभाग।

+0

धन्यवाद लार्क्स। क्या आउटपुट फ़ाइल नाम * आखिरी * (पहले नहीं) तर्क के रूप में संभव है? –

+0

मारियस होफर्ट: आप आसानी से अंतिम तत्व को नहीं हटा सकते हैं, इसलिए यह थोड़ा और मुश्किल है। ऐसा कुछ: 'outputfile = $ {@: -1}; आर्ग = ("$ {@: 1: $ (($ {# @} - 1))}") '। आपको इस लार्क्स के जवाब को स्वीकार करना चाहिए। – jordanm

+0

आप * कर सकते हैं *, लेकिन यह थोड़ा बदसूरत है। इडेलिक के पास उनके जवाब में एक उदाहरण है। आप अपने कोड में बहुत अधिक क्रूर के साथ खत्म हो जाते हैं। – larsks

18

पिछले तर्क के रूप में आउटपुट फ़ाइल एक सरणी पारित करने के लिए, का उपयोग करें:

ARGS=("[email protected]") 
# Get the last argument 
outputfile=${ARGS[-1]} 
# Drop it from the array 
unset ARGS[${#ARGS[@]}-1] 

exec gs ... -sOUTPUTFILE=$outputfile "${ARGS[@]}" 

संस्करण 4 से पहले, bash सरणियों में नकारात्मक सबस्क्रिप्ट की अनुमति नहीं दी है (और उत्पादित टिप्पणी में मेरियस द्वारा रिपोर्ट की गई त्रुटि) , इसलिए यदि आप 3.x का उपयोग कर रहे हैं तो आपको अधिक यूग्लियर

outputfile=${ARGS[${#ARGS[@]}-1]} 

यह बैश 4.x के लिए भी काम करता है।

+0

मैं प्राप्त: gsMerge infile1.pdf infile2.pdf all.pdf /usr/bin/gsMerge: लाइन 4: ARGS: बुरा सरणी सबस्क्रिप्ट **** प्रारंभिक डिवाइस को खोलने के लिए, छोड़ने में असमर्थ। –

+0

@ मैरियस: आप शायद 'बाश' के पुराने संस्करण का उपयोग कर रहे हैं। मैंने उस मामले को कवर करने के लिए उत्तर अपडेट किया। – Idelic

+0

धन्यवाद, इडेलिक, बहुत अच्छा। –

7

ऊपर Idelic के जवाब देने के लिए अंतिम तर्क का उपयोग करने के अलावा, आप भी कर सकते हैं:

echo "${@: $#}" 

यह सभी तर्क पढ़ता है और पिछले एक से शुरू उन्हें प्रिंट करता है। इस तरह, आप एन अंतिम तर्कों तक पहुंच सकते हैं, उदाहरण के लिए पिछले तीन तर्कों के लिए:

echo "${@: $#-2}" 

$ ./script "what does" "this script" "do" "?" 
this script do ? 
+0

वाह, यह कमाल है। मैनुअल में यह कहां परिभाषित किया गया है? और क्या इसका एक रेंज संस्करण है? –

+0

यह उत्तर देखें: [लिंक] (https://stackoverflow.com/questions/1335815/how-to-slice-an-array-in-bash) splicing arrays के बारे में, उपर्युक्त उत्तर केवल सरणी को टुकड़ा करने के लिए उपयोग कर रहा है इनपुट तर्क के। –

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