पाठ फ़ाइल को शाब्दिक रूप से पढ़ने के लिए, सादे का उपयोग न करें read, जो आउटपुट को दो तरीकों से संसाधित करता है:
read\पलायन चरित्र के रूप में व्याख्या ; read -rइसे बंद करने के लिए उपयोग करें।
readपात्रों में शब्दों में विभाजित $IFS; IFSइसे बंद करने के लिए एक खाली स्ट्रिंग पर सेट करें।
लाइन द्वारा एक पाठ फ़ाइल लाइन को संसाधित करने के लिए सामान्य मुहावरा है
while IFS= read -r line; do …
इस मुहावरे की व्याख्या के लिए, देखें कि while IFS= readइसके बजाय अक्सर ऐसा क्यों किया जाता है IFS=; while read..? ।
एक स्ट्रिंग को शाब्दिक रूप से लिखने के लिए, केवल सादे का उपयोग न करें echo, जो स्ट्रिंग को दो तरीकों से संसाधित करता है:
- कुछ गोले पर,
echoबैकलैश से बच निकलता है। (बैश पर, यह निर्भर करता है कि xpg_echoविकल्प सेट है या नहीं।)
- कुछ तारों को विकल्पों के रूप में माना जाता है, जैसे (
-nया -eसटीक सेट शेल पर निर्भर करता है)।
शाब्दिक रूप से एक स्ट्रिंग को मुद्रित करने का एक पोर्टेबल तरीका है printf। (बैश में कोई बेहतर तरीका नहीं है, जब तक आप जानते हैं कि आपका इनपुट विकल्प की तरह नहीं दिखता है echo।) सटीक स्ट्रिंग को प्रिंट करने के लिए पहले फ़ॉर्म का उपयोग करें, और दूसरा रूप यदि आप एक नई पंक्ति जोड़ना चाहते हैं।
printf %s "$line"
printf '%s\n' "$line"
यह केवल प्रोसेसिंग टेक्स्ट के लिए उपयुक्त है , क्योंकि:
- अधिकांश गोले इनपुट में अशक्त पात्रों पर चोक करेंगे।
- जब आपने अंतिम पंक्ति पढ़ी है, तो आपके पास यह जानने का कोई तरीका नहीं है कि अंत में एक नई रेखा थी या नहीं। (कुछ पुराने गोले बड़ी मुसीबत हो सकते हैं यदि इनपुट एक नई रेखा के साथ समाप्त नहीं होता है।)
आप शेल में बाइनरी डेटा को संसाधित नहीं कर सकते हैं, लेकिन अधिकांश यूनियनों पर उपयोगिताओं के आधुनिक संस्करण मनमाने डेटा के साथ सामना कर सकते हैं। आउटपुट के माध्यम से सभी इनपुट पास करने के लिए, उपयोग करें cat। स्पर्शरेखा पर जाना, echo -n ''कुछ न करने का एक जटिल और गैर-पोर्टेबल तरीका है; echo -nसिर्फ उतना ही अच्छा होगा (या शेल के आधार पर नहीं), और :सरल और पूरी तरह से पोर्टेबल है।
: >| "$file"
cat >>"$file"
या, सरल,
cat >|"$file"
स्क्रिप्ट में, आपको आमतौर पर डिफ़ॉल्ट रूप से बंद >|होने की आवश्यकता नहीं होती है noclobber।