Untuk apa nilainya, saya perlu melakukan itu cukup sering, dan tidak pernah dapat mengingat cara penggunaan yang tepat while IFS= read...
, jadi saya mendefinisikan fungsi berikut di profil bash saya:
# 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
}
Fungsi ini pertama-tama menentukan jumlah baris dalam file, kemudian digunakan sed
untuk mengekstrak baris demi baris, dan meneruskan setiap baris sebagai argumen string tunggal ke fungsi yang diberikan. Saya kira ini mungkin menjadi sangat tidak efisien dengan file besar, tapi itu belum menjadi masalah bagi saya sejauh ini (saran tentang bagaimana meningkatkan sambutan ini tentu saja).
Penggunaannya IMO cukup manis:
>> 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
<
ke seluruh lingkaran. Meskipun masuk akal sekarang saya melihatnya