शेल के उद्धृत नियमों के अनुसार, बैकस्लैश का उपचार विशेष रूप से किया जाता है echo -e
, लेकिन पहले उन्हें कभी-कभी शेल द्वारा विशेष रूप से व्यवहार किया जाता है (जो इस मामले में है bash
) ।
तर्क echo
वास्तव में देखता है Hello\\n
। क्योंकि आप पास हो -e
गए हैं echo
, यह बैकस्लैश से बचता है, विशेष रूप से बचता है, और \\
एक एकल में ढह जाता है \
। फाइनल n
बच नहीं जाता है, इसलिए यह सचमुच दिखाई देता है।
इसका कारण यह है कि, echo
स्वयं के संचालन से पहले और अलग से , शेल कुछ संदर्भों में विशेष रूप से व्यवहार करता\
है, लेकिन अन्य नहीं। निर्विवाद \
पात्रों को हमेशा विशेष रूप से व्यवहार किया जाता है, एकल-उद्धृत \
का कभी भी विशेष रूप से इलाज नहीं किया जाता है, लेकिन दोहरे-उद्धृत \
वर्णों का उपचार , जैसा कि आपके द्वारा चलाए गए आदेश में है, अधिक सूक्ष्म और जटिल है।
जब शेल एक कमांड में डबल-कोटेड टेक्स्ट का सामना "Hello\\\n"
करता है, तो उसके साथ , यह \
एक भागने चरित्र के रूप में व्यवहार करता है जब यह एक चरित्र से पहले होता है जो कि दोहरे उद्धरण के अंदर विशेष अर्थ हो सकता है और अन्यथा नहीं ।
- क्योंकि
\
कभी-कभी अंदर एक विशेष अर्थ होता है ""
, \
जो तुरंत दूसरे से पहले होता \
है, उस दूसरे को उद्धृत करने का प्रभाव होता है \
। तो दोहरे उद्धरण चिह्नों के अंदर, पहले \\
ढह जाते हैं \
।
- उन पहले दो
\
पात्रों के बाद , एक तीसरा \
चरित्र है जो उन पहले दो से अप्रभावित है और जो एक से पहले है n
। लेकिन n
एक ऐसा चरित्र नहीं है जिसे कभी भी दोहरे उद्धरण के अंदर विशेष रूप से व्यवहार किया जाता है, इसलिए \
इससे पहले कि इस स्थिति में विशेष रूप से व्यवहार नहीं किया जाता है। इस प्रकार \n
रहता है \n
।
इसका प्रभाव यह है कि, दोहरे उद्धरण चिह्नों के \\\n
रूप में व्याख्या की गई है \\n
।
जब echo -e
देखता है \\n
, पहले \
दूसरे से विशेष अर्थ निकालता है, तो उस पाठ के लिए शाब्दिक रूप से echo
प्रिंट \n
करता है।
यदि आपका लक्ष्य Hello
एक अतिरिक्त न्यूलाइन के साथ प्रिंट करना है, लेकिन कोई बैकस्लैश नहीं है (प्रश्न मूल रूप से इस बारे में अस्पष्ट था, साथ ही मुझे लगता है कि यह एक उपयोगी उदाहरण है), तो एक समाधान एक को दूर करना है \
। अंत में एक अतिरिक्त newline के साथ echo -e "Hello\\n"
आउटपुट रनिंग Hello
।
एक बेहतर समाधान एकल उद्धरणों का उपयोग करना और लिखना है echo -e 'Hello\n'
। एकल उद्धरण उद्धरण का सबसे मजबूत रूप हैं। एक बेहतर समाधान आमतौर पर printf
इसके बजाय उपयोग करना है echo
, जो इस मामले में होगा printf 'Hello\n\n'
।
यदि आपका लक्ष्य Hello\
बैकस्लैश सहित प्रिंट करना है, उसके बाद एक अतिरिक्त न्यूलाइन है , तो डबल-कोटेड दृष्टिकोण संभव है लेकिन बोझिल है। यह पता लगाने के लिए, काम पीछे की ओर: echo -e
धर्मान्तरित \\
करने के लिए \
और \n
एक नई पंक्ति के लिए, और डबल के हवाले से धर्मान्तरित \\
करने के लिए \
है, तो आप छह बैकस्लैश (साथ यह कर सकते हैं echo -e "Hello\\\\\\n"
), क्योंकि \\n
में बदल जाता है \n
की वजह से एक बैकस्लैश एक और भागने। आप इसे पांच के साथ भी कर सकते हैं, क्योंकि \n
जब \
बच नहीं जाता है तो दोहरे-उद्धरण को बनाए रखता है।
यह एकल उद्धरण के लाभ को दर्शाता है: बस जो कुछ भी आप echo -e
एकल उद्धरण के अंदर देखना चाहते हैं उसे डालें ( echo -e 'Hello\\\n'
)। printf
यहाँ भी अच्छा है। एक विकल्प है printf 'Hello\\\n\n'
। लेकिन जहां printf
वास्तव में चमक है कि आप अतिरिक्त तर्कों में प्लग कर सकते हैं। आप उपयोग कर सकते हैं printf '%s\n\n' 'Hello\'
, जो दूसरे तर्क को सम्मिलित करता है (शाब्दिक Hello\
क्योंकि एकल उद्धरण कुछ भी नहीं बदलता है) %s
।