สำหรับสิ่งที่คุ้มค่าฉันต้องทำบ่อยและไม่สามารถจดจำวิธีการใช้ที่แน่นอนได้while IFS= read...
ดังนั้นฉันจึงกำหนดฟังก์ชันต่อไปนี้ในโปรไฟล์ทุบตีของฉัน:
# 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
}
ฟังก์ชันนี้กำหนดจำนวนบรรทัดในไฟล์ก่อนจากนั้นใช้sed
เพื่อแยกบรรทัดหลังจากบรรทัดและผ่านแต่ละบรรทัดเป็นอาร์กิวเมนต์สตริงเดียวไปยังฟังก์ชันใด ๆ ฉันคิดว่านี่อาจไม่มีประสิทธิภาพกับไฟล์ขนาดใหญ่ แต่นั่นก็ยังไม่เป็นปัญหาสำหรับฉัน (คำแนะนำเกี่ยวกับวิธีปรับปรุงการต้อนรับนี้แน่นอน)
การใช้งานค่อนข้างน่ารัก 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
<
เข้ามาวนวนได้เลย แม้ว่าตอนนี้ฉันจะเข้าใจได้อย่างสมบูรณ์แบบ แต่ตอนนี้ฉันเห็นแล้ว