Ký hiệu chính xác cho Thay thế Quy trình là:
while read i; do echo $i; done < <(echo "$FILECONTENT")
Giá trị cuối cùng của i
được gán trong vòng lặp sẽ khả dụng khi vòng lặp kết thúc. Một thay thế là:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Các dấu ngoặc nhọn là một hoạt động nhóm I / O và bản thân nó không tạo ra một vỏ con. Trong bối cảnh này, chúng là một phần của một đường ống và do đó được chạy dưới dạng một vỏ con, nhưng đó là vì |
, không phải { ... }
. Bạn đề cập đến điều này trong câu hỏi. AFAIK, bạn có thể thực hiện trả về từ bên trong các hàm này bên trong một hàm.
Bash cũng cung cấp shopt
nội trang và một trong nhiều tùy chọn của nó là:
lastpipe
Nếu được đặt và điều khiển công việc không hoạt động, trình bao sẽ chạy lệnh cuối cùng của một đường ống không được thực thi ở chế độ nền trong môi trường trình bao hiện tại.
Do đó, sử dụng một cái gì đó như thế này trong một tập lệnh làm cho bản sửa đổi sum
có sẵn sau vòng lặp:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Thực hiện điều này tại dòng lệnh thường gặp lỗi 'kiểm soát công việc không hoạt động' (nghĩa là tại dòng lệnh, kiểm soát công việc đang hoạt động). Không thể kiểm tra điều này mà không sử dụng tập lệnh.
Ngoài ra, như đã được Gareth Rees lưu ý trong câu trả lời của mình , đôi khi bạn có thể sử dụng một chuỗi ở đây :
while read i; do echo $i; done <<< "$FILECONTENT"
Điều này không yêu cầu shopt
; bạn có thể lưu một quá trình bằng cách sử dụng nó.