2011-07-29 12 views
9

Tôi đang cố thực hiện lệnh cho mỗi dòng đến từ lệnh cat. Tôi đang dựa trên mã mẫu này tôi nhận được từ một nhà cung cấp.Đầu ra in của câu lệnh cat trong bash script loop

Đây là kịch bản:

for tbl in 'cat /tmp/tables' 
do 
    echo $tbl 
done 

Vì vậy, tôi đã mong đầu ra được mỗi dòng trong file. Thay vào đó, tôi nhận được điều này:

cat 
/tmp/tables 

Đó rõ ràng không phải là những gì tôi muốn.

Tôi sẽ thay thế tiếng vọng bằng lệnh thực tế giao tiếp với cơ sở dữ liệu.

Bất kỳ trợ giúp nào trong việc thực hiện điều này sẽ được đánh giá cao.

Trả lời

14

Bạn đang sử dụng loại báo giá sai.

Bạn cần sử dụng dấu ngoặc kép chứ không phải dấu ngoặc đơn để làm cho đối số là một chương trình đang chạy và chuyển nội dung ra khỏi vòng lặp.

for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 

Ngoài ra để có thể đọc tốt hơn (nếu bạn đang sử dụng bash), bạn có thể viết nó như

for tbl in $(cat /tmp/tables) 
do 
    echo "$tbl" 
done 

Nếu mong đợi của bạn là để có được mỗi dòng (for-vòng trên sẽ cung cấp cho bạn mỗi từ), sau đó bạn có thể tốt hơn bằng cách sử dụng xargs, như thế này

cat /tmp/tables | xargs -L1 echo 

hay như một vòng lặp

cat /tmp/tables | while read line; do echo "$line"; done 
+1

Tôi biết đó là một cái gì đó ngu ngốc như thế này. Cảm ơn. – geoffrobinson

2

Các dấu nháy đơn nên backticks:

for tbl in `cat /etc/tables` 

Mặc dù, điều này sẽ không giúp bạn có được đầu ra/đầu vào dòng, nhưng bằng lời. Để xử lý từng dòng, bạn nên thử một cái gì đó như:

cat /etc/tables | while read line 
    echo $line 
done 
3

Với khi loop:

while read line 
do 
echo "$line" 
done < "file" 
2
while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables 

đọc this.

0

Bạn có thể làm được rất nhiều phân tích trong bash bởi xác định lại IFS (Input Dòng Seperator), ví dụ

IFS='\t\n' 
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 
+0

'\ t \ n'? Bạn đã thực sự thử nó trong bash? Nó sẽ chia thành '\', 't', 'n', không hữu ích. – kubanczyk