2009-11-20 11 views
6

मैं गलत कहां जा रहा हूं?बैश स्क्रिप्ट में पोजीशनल पैरामीटर को फिर से कैसे करें?

./script.sh tau xhpl mpi_tile_io fft PMB_MPI 

मैं ग्रेप अंदर खोज करना चाहते हैं:

filename_tau.txt 
filename_xhpl.txt 
fiename_fft.txt 
filename_PMB_MPI.txt 
filename_mpi_tile_io.txt 

मैं tau, xhpl, fft, mpi_tile_io और स्क्रिप्ट के लिए स्थितीय पैरामीटर के रूप में PMB_MPI इस प्रकार पारित:

मैं इस प्रकार कुछ फ़ाइलें एक पाश, पहली खोज ताऊ, xhpl और इतने पर ..

point=$1  #initially points to first parameter 
i="0" 
while [$i -le 4] 
do 
    grep "$str" ${filename}${point}.txt 
    i=$[$i+1] 
    point=$i  #increment count to point to next positional parameter 
done 
+0

क्या स्क्रिप्ट की तरह? –

+0

बैश स्क्रिप्ट .. क्षमा करें मैं इसे उल्लेख करना भूल गया –

+0

टैग की तरह चीजों को रखना याद रखना, यह आपके लक्षित दर्शकों के लिए प्रश्न को आसान बनाता है, यानी। वे लोग जिन्होंने एक दिलचस्प टैग के रूप में बैश स्क्रिप्ट को फ़िल्टर किया है। –

उत्तर

6

इस तरह के लूप के लिए अपना सेट अप करें। इस वाक्यविन्यास के साथ, लूप स्थितित्मक मानकों पर पुनरावृत्त करता है, जिससे प्रत्येक को 'बिंदु' में बदल दिया जाता है।

for point; do 
    grep "$str" ${filename}${point}.txt 
done 
+2

मैं रिक्त स्थान के साथ परेशानी से बचने के लिए फ़ाइल नाम तर्क के चारों ओर उद्धरण सुझाता हूं। –

+0

मुझे लगता है कि आप 'point =" $ @ "' जैसे असाइनमेंट खो रहे हैं। –

+0

हारून, अच्छा बिंदु। मैंने बिना किसी संपादन के प्रश्न से उस पंक्ति को कॉपी/चिपकाया। डेनिस, यह सही नहीं है। सीधे बिंदु पर असाइन करने की कोई आवश्यकता नहीं है। सभी विवरणों के लिए बैश मैनुअल के "कंपाउंड कमांड" अनुभाग देखें। –

2

here देखें, आपको स्थितित्मक पैरामीटर के माध्यम से चरण में स्थानांतरित करने की आवश्यकता है।

1

कुछ इस तरह का प्रयास करें:

# Iterating through the provided arguments 
for ARG in $*; do 
    if [ -f filename_$ARG.txt]; then 
     grep "$str" filename_$ARG.txt 
    fi 
done 
3

वहाँ एक से अधिक तरीका यह है है और, जबकि मैं shift का प्रयोग करेंगे, यहाँ किस्म के लिए एक और है। यह बैश के अविवेक सुविधा का उपयोग करता:

इस विधि को
#!/bin/bash 
for ((i=1; i<=$#; i++)) 
do 
    grep "$str" ${filename}${!i}.txt 
done 

लाभ यह है कि आप शुरू करने और अपने पाश कहीं भी रोक सकता है। मान लें कि आप रेंज मान्य कर दिया है, आप की तरह कुछ कर सकता है:

for ((i=2; i<=$# - 1; i++)) 

इसके अलावा, आप पिछले परम चाहते हैं: ${!#}

+0

अच्छा जोड़ा डेनिस - बस मुझे अभी क्या चाहिए – joelparkerhenderson

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