2009-09-21 44 views
8

Tôi có thể làm điều này bằng bất kỳ ngôn ngữ nào khác, nhưng với Bash tôi đã nhìn xa và rộng và không thể tìm thấy câu trả lời.Lặp lại thủ công một dòng của một tệp | bash

Tôi cần tăng thủ công $line trong tập lệnh. Ví dụ:

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

Nếu bạn nhận thấy, mỗi lần foo_loop lặp lại, $line vẫn giữ nguyên. Tôi cần phải lặp lại $line ở đó và đảm bảo bản gốc cho vòng lặp chỉ chạy số dòng trong tệp.

Tôi đã nghĩ về việc tìm số dòng trong tệp bằng cách sử dụng một vòng lặp khác và lặp lại biến dòng bên trong vòng trong của foo().

Bất kỳ ý tưởng nào?

EDIT:

Xin lỗi vì đã quá mơ hồ.

Ở đây chúng ta đi:

Tôi đang cố gắng để thực hiện một phần của mã của tôi thực hiện nhiều lần (thực hiện song song)

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

Đó là mã làm việc tốt, vì foo chỉ đang trong giá trị của dòng; nhưng nếu tôi muốn làm điều này:

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

$line sẽ tương đương với giá trị trong suốt vòng lặp while. Tôi cần nó để thay đổi với vòng lặp while, sau đó tiếp tục khi nó quay lại for. Ví dụ:

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

Nếu nội dung của tập tin là

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

Đầu ra của chương trình ví dụ sẽ được (nếu số lượng tối đa cho phép là 3)

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

Nơi tôi muốn nó là

Hi Bye Yellow Green 

Tôi hy vọng thế này tốt hơn. Tôi đang cố hết sức để giải thích vấn đề của mình.

+0

Tôi nghĩ chúng ta cần một ví dụ rõ ràng hơn về những gì bạn đang cố gắng hoàn thành. foo() xuất hiện để xác định một hàm shell trong vòng lặp, mà tôi không chắc chắn là những gì bạn muốn. –

Trả lời

16

Thay vì sử dụng vòng lặp for để đọc qua tệp, bạn có thể đọc qua tệp như vậy.

#!bin/bash 

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

Lưu ý rằng điều này sẽ không hoàn toàn phù hợp với các dòng có dấu gạch chéo ngược (đọc loại bỏ chúng) và khoảng trắng đầu và/hoặc đuôi (cũng bị loại bỏ). Cách thích hợp là sử dụng 'read-line 'để tránh việc loại bỏ dấu gạch chéo ngược và đặt' IFS = 'để tránh việc loại bỏ khoảng trắng. – Jens

6

dài truyện ngắn, while read line; do _____ ; done

Sau đó, hãy chắc chắn rằng bạn có hai dấu ngoặc kép xung quanh "$ line" để một tham số không giới hạn bởi không gian.

Ví dụ:

$ cat /proc/cpuinfo | md5sum 
c2eb5696e59948852f66a82993016e5a *- 

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

dụ thứ hai # thêm.gz vào mọi tệp trong thư mục hiện tại: # Nếu bất kỳ tệp nào có dấu cách, lệnh mv cho dòng đó sẽ trả về lỗi.

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

-1 cho việc sử dụng mèo vô dụng. Bạn có biết bạn có thể chuyển hướng thành các lệnh ghép không? 'trong khi đọc ...; làm ...; thực hiện Jens

1

Bạn nên đăng theo dõi dưới dạng chỉnh sửa cho câu hỏi của mình hoặc trong nhận xét thay vì trả lời.

Cấu trúc này:

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

Sản lượng:

Hi 
Hi 
Hi 
Bye 
Bye 
Bye 
...etc.

Trong khi điều này một:

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

Sản lượng:

Hi 
Bye 
Yellow 
Green 
Hi 
Bye 
Yellow 
Green 
...etc.
Các vấn đề liên quan