ตามคำนิยามไฟล์ข้อความประกอบด้วยลำดับของบรรทัด เส้นปลายด้วยตัวอักษรขึ้นบรรทัดใหม่ ดังนั้นไฟล์ข้อความจึงลงท้ายด้วยอักขระบรรทัดใหม่เว้นเสียแต่ว่ามันจะว่างเปล่า
read
ในตัวมีความหมายเพียงการอ่านไฟล์ข้อความ คุณไม่ได้ส่งไฟล์ข้อความดังนั้นคุณจึงไม่สามารถหวังให้ไฟล์ทำงานได้อย่างราบรื่น เชลล์อ่านทุกบรรทัด - สิ่งที่ข้ามไปคืออักขระพิเศษหลังจากบรรทัดสุดท้าย
หากคุณมีไฟล์อินพุตที่อาจผิดรูปแบบซึ่งอาจหายไปจากบรรทัดสุดท้ายคุณสามารถเพิ่มบรรทัดใหม่ให้กับมันเพื่อให้แน่ใจ
{ cat "/tmp/urlFile"; echo; } | …
ไฟล์ที่ควรเป็นไฟล์ข้อความ แต่หายไปขึ้นบรรทัดใหม่มักจะถูกสร้างขึ้นโดยบรรณาธิการของ Windows สิ่งนี้มักจะรวมกับการสิ้นสุดของบรรทัด Windows ซึ่งก็คือ CR LF ซึ่งตรงข้ามกับ LF ของ Unix อักขระ CR มีประโยชน์น้อยมากในทุกที่และไม่สามารถปรากฏใน URL ได้ในทุกกรณีดังนั้นคุณควรลบออก
{ <"/tmp/urlFile" tr -d '\r'; echo; } | …
ในกรณีที่ไฟล์อินพุตมีรูปแบบที่ถูกต้องและลงท้ายด้วยบรรทัดใหม่การecho
เพิ่มบรรทัดว่างพิเศษ เนื่องจาก URL ต้องไม่ว่างเปล่าเพียงแค่ละเว้นบรรทัดว่าง
โปรดทราบว่าread
จะไม่อ่านบรรทัดอย่างตรงไปตรงมา มันละเว้นช่องว่างนำหน้าและต่อท้ายซึ่งสำหรับ URL อาจเป็นที่ต้องการ มันจะใช้เครื่องหมายแบ็กสแลชที่ส่วนท้ายของบรรทัดเป็นอักขระยกเว้นทำให้บรรทัดถัดไปถูกรวมเข้ากับลำดับแรกลบด้วยเครื่องหมายแบ็กสแลช - นิวไลน์ซึ่งไม่ต้องการอย่างแน่นอน ดังนั้นคุณควรผ่านการเลือกที่จะ-r
read
มันเป็นอย่างมากที่หายากมากสำหรับที่จะเป็นสิ่งที่ถูกต้องมากกว่าread
read -r
{ <"/tmp/urlFile" tr -d '\r'; echo; } | while read -r url
do
if [ -z "$url" ]; then continue; fi
…
done