Đối với những gì đáng giá, tôi cần phải làm điều đó khá thường xuyên và không bao giờ có thể nhớ chính xác cách sử dụng while IFS= read...
, vì vậy tôi đã xác định hàm sau trong hồ sơ bash của mình:
# iterate the line of a file and call input function
iterlines() {
(( $# < 2 )) && { echo "Usage: iterlines <File> <Callback>"; return; }
local File=$1
local Func=$2
n=$(cat "$File" | wc -l)
for (( i=1; i<=n; i++ )); do
"$Func" "$(sed "${i}q;d" "$File")"
done
}
Hàm này trước tiên xác định số lượng dòng trong tệp, sau đó sử dụng sed
để trích xuất dòng sau dòng và chuyển từng dòng dưới dạng một đối số chuỗi cho bất kỳ hàm đã cho. Tôi cho rằng điều này có thể thực sự không hiệu quả với các tệp lớn, nhưng điều đó không phải là vấn đề đối với tôi cho đến nay (tất nhiên là đề xuất về cách cải thiện sự chào đón này).
Cách sử dụng khá ngọt ngào IMO:
>> cat example.txt # note the use of spaces, whitespace, etc.
a/path
This is a sentence.
"wi\th quotes"
$End
>> iterlines example.txt echo # preserves quotes, $ and whitespace
a/path
This is a sentence.
"wi\th quotes"
$End
>> x() { echo "$#"; }; iterlines example.txt x # line always passed as single input string
1
1
1
1
1
<
vào một vòng lặp. Mặc dù nó hoàn toàn có ý nghĩa bây giờ tôi đã thấy nó