द्वारा परिभाषा , एक पाठ फ़ाइल लाइनों की एक अनुक्रम के होते हैं। एक पंक्ति एक नई पंक्ति वर्ण के साथ समाप्त होती है। इस प्रकार एक टेक्स्ट फ़ाइल एक नए वर्ण के साथ समाप्त होती है, जब तक कि वह खाली न हो।
readBuiltin केवल पाठ फ़ाइलों को पढ़ने के लिए है। आप एक पाठ फ़ाइल पास नहीं कर रहे हैं, इसलिए आप इसे मूल रूप से काम करने की उम्मीद नहीं कर सकते। शेल सभी पंक्तियों को पढ़ता है - यह जो लंघन है वह अंतिम पंक्ति के बाद के अतिरिक्त वर्ण हैं।
यदि आपके पास संभावित रूप से विकृत इनपुट फ़ाइल है जो इसकी अंतिम पंक्ति गुम हो सकती है, तो आप इसमें एक नई पंक्ति जोड़ सकते हैं, बस सुनिश्चित करने के लिए।
{ cat "/tmp/urlFile"; echo; } | …
फ़ाइलें जो पाठ फ़ाइलें होनी चाहिए, लेकिन अंतिम नईलाइन याद आ रही हैं, अक्सर विंडोज संपादकों द्वारा निर्मित की जाती हैं। यह आमतौर पर विंडोज लाइन एंडिंग के साथ संयोजन में जाता है, जो कि सीआर एलएफ हैं, जैसा कि यूनिक्स के एलएफ के विपरीत है। सीआर अक्षर शायद ही कभी कहीं उपयोगी होते हैं, और किसी भी स्थिति में 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