2009-09-21 4 views
8

मैं इसे किसी अन्य भाषा में कर सकता था, लेकिन बैश के साथ मैंने दूर और चौड़ा देखा और जवाब नहीं मिला।मैन्युअल रूप से फ़ाइल की एक पंक्ति को पुन: सक्रिय करना | bash

मुझे स्क्रिप्ट में $line मैन्युअल रूप से बढ़ाने की आवश्यकता है। उदाहरण:

for line in `cat file` 
do 
foo() 
     foo_loop(condition) 
{ 
do_something_to_line($line) 
} 
done 

अगर आप देखते हैं, हर बार foo_loop दोहराता, $line ही रहता है। मुझे वहां $line फिर से चालू करने की आवश्यकता है, और सुनिश्चित करें कि लूप के लिए मूल केवल फ़ाइल में लाइनों की संख्या चलाता है।

मैंने एक अलग लूप का उपयोग करके फ़ाइल में लाइनों की संख्या और foo() के आंतरिक लूप के अंदर लाइन वैरिएबल को फिर से चलाने के बारे में सोचा है।

कोई विचार?

संपादित करें:

इतना अस्पष्ट होने के लिए क्षमा करें।

ये हम चले:

मैं अपने कोड का एक खंड बनाने के लिए कोशिश कर रहा हूँ

Function foo() # Does something 
for line in `cat $temp_file`; 
foo($line) 

कि कोड सिर्फ ठीक काम करता है कई बार (समानांतर निष्पादन) पर अमल, क्योंकि foo बस में ले जा रहा है रेखा का मूल्य; लेकिन अगर मैं ऐसा करने के लिए चाहता था:

Function foo() # Does something 
for line in `cat $temp_file`; 
while (some condition) 
foo($line) 
end 

$line जबकि पाश भर एक ही मूल्य के बराबर होगा। मुझे इसे while लूप के साथ बदलने की आवश्यकता है, फिर यह for पर वापस जाने पर जारी रखें। उदाहरण:

line = Hi 
foo{ echo "$line" }; 
for line in `cat file`; 
while (number_of_processes_running -lt max_number_allowed) 
foo($line) 
end 

तो फ़ाइल की सामग्री थे

Hi \n Bye \n Yellow \n Green \n 

उदाहरण कार्यक्रम का उत्पादन किया जाएगा (यदि अधिकतम संख्या की अनुमति दी थी 3)

Hi Hi Hi Bye Bye Bye Yellow Yellow Yellow Green Green Green. 

मैं इसे कहाँ करना चाहते हैं

Hi Bye Yellow Green 

मुझे उम्मीद है यह बेहतर है। मैं अपनी समस्या को समझाने के लिए अपनी पूरी कोशिश कर रहा हूं।

+0

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

उत्तर

16

फ़ाइल के माध्यम से पढ़ने के लिए लूप का उपयोग करने के बजाय आपको शायद फ़ाइल के माध्यम से पढ़ना चाहिए।

#!bin/bash 

while read line 
do 
    do_something_to_line($line) 
done < "your.file" 
+0

ध्यान दें कि यह बैकस्लाश के साथ लाइनों के लिए काफी काम नहीं करेगा (उन्हें हटा देता है) और अग्रणी और/या पीछे की ओर सफेद स्थान (हटाया गया)। बैकस्लैश हटाने से बचने के लिए और व्हाइटस्पेस हटाने से बचने के लिए 'IFS =' सेट करने के लिए 'read -r line' का उपयोग करना उचित तरीका है। बिल्ली के बेकार उपयोग के लिए – Jens

6

कम लंबी कहानी, while read line; do _____ ; done

फिर, सुनिश्चित करें कि आप डबल उद्धरण के आसपास "$ लाइन" है ताकि एक पैरामीटर रिक्त स्थान से सीमांकित नहीं है।

उदाहरण:

$ cat /proc/cpuinfo | md5sum 
c2eb5696e59948852f66a82993016e5a *- 

$ cat /proc/cpuinfo | while read line; do echo "$line"; done | md5sum 
c2eb5696e59948852f66a82993016e5a *- 

दूसरा उदाहरण # जोड़ें।वर्तमान निर्देशिका में प्रत्येक फ़ाइल में gz: # अगर किसी भी फाइल में रिक्त स्थान थे, तो उस पंक्ति के लिए mv कमांड एक त्रुटि लौटाएगा।

$ find -type f -maxdepth 1 | while read line; do mv "$line" "$line.gz"; done 
+1

-1। क्या आप जानते थे कि आप यौगिक कमांड में भी रीडायरेक्ट कर सकते हैं? 'पढ़ते समय ...; कर ...; किया Jens

1

आपको फॉलो-अप को अपने प्रश्न के संपादन के रूप में या उत्तर के बजाय टिप्पणियों में पोस्ट करना चाहिए।

यह संरचना:

while read line 
do 
    for ((i=1; i<$max_number_allowed; i++)) 
    do 
     foo $line 
    done 
done < file 

पैदावार:

Hi 
Hi 
Hi 
Bye 
Bye 
Bye 
...etc.

हालांकि यह एक:

for ((i=1; i<$max_number_allowed; i++)) 
do 
    while read line 
    do 
     foo $line 
    done < file 
done 

पैदावार:

Hi 
Bye 
Yellow 
Green 
Hi 
Bye 
Yellow 
Green 
...etc.