ฉันมีสคริปต์ต่อไปนี้:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
รหัสนี้ใช้งานได้ดี แต่ฉันไม่เข้าใจสิ่งเหล่านี้:
<&3
done < file11 3< file22
ฉันมีสคริปต์ต่อไปนี้:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
รหัสนี้ใช้งานได้ดี แต่ฉันไม่เข้าใจสิ่งเหล่านี้:
<&3
done < file11 3< file22
คำตอบ:
สคริปต์อ่านสตริงคู่จากสองไฟล์ ในแต่ละซ้ำมันอ่านสตริงจากfile11
เข้ามาlineA
และจากการเข้าfile22
lineB
มันทำเช่นนี้จนกว่าจะพบจุดสิ้นสุดของไฟล์ใดไฟล์หนึ่ง เนื้อความของลูปส่งเอาต์พุตสองสตริงและบรรทัดว่าง
<file11
หมายถึง "การเชื่อมต่อ / เปลี่ยนเส้นทางเข้ามาตรฐานจากfile11
เข้าไปในคำสั่งนี้" ที่ "คำสั่งนี้" เป็นwhile
ห่วง 0<file11
นอกจากนี้ยังอาจได้รับการเขียน
อินพุตมาตรฐานคือหมายเลขอธิบายไฟล์ 0 ตัวอธิบายไฟล์ 1 และ 2 ถูกสงวนไว้สำหรับเอาต์พุตมาตรฐานและสตรีมข้อผิดพลาดมาตรฐาน
3<file22
หมายถึง "การเชื่อมต่อไฟล์อธิบาย 3 file22
สำหรับคำสั่งนี้" หมายเลข 3 เกิดขึ้นเป็นหมายเลขตัวอธิบายไฟล์ "ฟรี" ตัวถัดไป แต่โค้ดสามารถใช้ 4 หรือ 5 หรือจำนวนเต็มขนาดเล็กอื่น ๆ ที่ไม่ใช่ 0, 1 และ 2 แทน (ขีด จำกัด ของหมายเลขตัวอธิบายไฟล์ที่ใช้งานได้ขึ้นอยู่กับเชลล์คืออะไร กำลังใช้งาน แต่รับประกันได้ถึง 9 หมายเลข)
ในลูปread lineA
จะอ่านสตริงจากอินพุตมาตรฐานโดยค่าเริ่มต้นคือจากไฟล์file11
(อินพุตมาตรฐานนั้นสืบทอดมาจากลูป) read lineA <&0
นอกจากนี้ยังอาจได้รับการเขียน
ด้วยread lineB <&3
การread
ใช้คำสั่งอ่านจากไฟล์อธิบาย 3 คือจากfile22
มากกว่าจากการป้อนข้อมูลมาตรฐาน (ไฟล์อธิบาย 3 สามารถใช้ได้ในวงเช่นเดียวกับการป้อนข้อมูลมาตรฐานคือ)
กล่าวโดยย่อจะใช้สตรีมอินพุตมาตรฐานและตัวอธิบายไฟล์ "พิเศษ" (หมายเลข 3) เพื่ออ่านจากสองไฟล์ "พร้อมกัน" (สตริงในแต่ละครั้งจากแต่ละไฟล์) โดยปกติจะมีเพียงหนึ่งในการเข้าถึงหนึ่งสตรีมใส่ แต่ทะลุข้อ จำกัด ที่ชัดเจนโดยการสร้างกระแสอินพุทที่สองและการเชื่อมต่อไปยังfile22
ไฟล์
ที่เกี่ยวข้อง:
ฉันใช้คำว่า "string" ด้านบนมากกว่า "line" สิ่งที่อ่านจากไฟล์ทั้งสองจะมีช่องว่างขนาบข้างหลุดออกมาและลำดับการหลบหนีบางอย่างจะถูกตีความเป็นพิเศษ
หากต้องการอ่านบรรทัดโดยใช้read
ให้ใช้
IFS= read -r varname
ที่เกี่ยวข้อง:
3<file22
เป็นเหมือนfopen
ที่ที่FID
ไม่ถูกส่งคืน แต่ถูกระบุล่วงหน้าหรือไม่
fdopen()
คุณจะอธิบาย ใช่.