2010-03-04 24 views
11

Tôi đang cố gắng để làm một cái gì đó giống nhưĐọc nhiều dòng trong bash mà không sinh ra một vỏ mới?

var=0 
grep "foo" bar | while read line; do 
    var=1 
done 

Thật không may điều này không làm việc kể từ khi đường ống gây ra thời gian để chạy trong một subshell. Có cách nào tốt hơn để làm điều này? Tôi không cần phải sử dụng "đọc" nếu có một giải pháp khác.

Tôi đã xem Bash variable scope tương tự, nhưng tôi không thể nhận được bất kỳ thứ gì hoạt động được từ nó.

+0

Đây là http://mywiki.wooledge.org/BashFAQ/024 – tripleee

Trả lời

17

Nếu bạn thực sự đang làm điều gì đó đơn giản, bạn thậm chí không cần vòng lặp while read. Sau đây sẽ làm việc:

VAR=0 
grep "foo" bar && VAR=1 
# ... 

Nếu bạn thực sự cần vòng lặp, bởi vì những thứ khác đang xảy ra trong vòng lặp, bạn có thể chuyển hướng từ một <(commands) quá trình thay thế:

VAR=0 
while read line ; do 
    VAR=1 
    # do other stuff 
done < <(grep "foo" bar) 
+2

(danh sách)? Không phải là nó được gọi là thay thế quá trình? http://tldp.org/LDP/abs/html/process-sub.html – pihentagy

2

sau đó không sử dụng ống và mất grep

var=1 
while read line 
do 
    case "$line" in 
    *foo*) var=1 
    esac 
done <"file" 
echo "var after: $var" 
Các vấn đề liên quan