2009-09-21 29 views
8

我可以用任何其他語言做到這一點,但用Bash我看起來很廣泛,找不到答案。手動迭代文件的一行| bash

我需要在腳本中手動增加$line。例如:

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

如果你注意到,每一次迭代foo_loop$line保持不變。我需要在那裏迭代$line,並確保原始的for循環僅運行文件中的行數。

我想過使用不同的循環找到文件中的行數,並在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循環相同的值。我需要使用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. 

如果我想讓它be

Hi Bye Yellow Green 

我希望這個更好。我正在盡力解釋我的問題。

+0

我認爲我們需要一個更清晰的例子來說明你想要完成的事情。 foo()似乎在一個循環內定義了一個shell函數,我不知道你想要什麼。 – 2009-09-21 20:16:54

回答

16

除了使用for循環來讀取文件,您應該可以像讀取文件一樣讀取文件。

#!bin/bash 

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

請注意,對於具有反斜線的行(讀取刪除它們)和引導和/或尾隨空白(也刪除),這不起作用。正確的方法是使用'read -r line'來避免刪除反斜槓並設置'IFS ='以避免刪除空白。 – Jens 2011-08-27 09:15:56

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 2011-08-27 09:18:26

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.