2010-09-06 23 views
16
VAR="-e xyz" 
echo $VAR 

किसी कारण से "xyz" प्रिंट करता है। मैं शुरू करने के लिए एक स्ट्रिंग पाने के लिए एक रास्ता खोजने में सक्षम नहीं प्रतीत होता है।बैश: इको स्ट्रिंग जो

यहां क्या हो रहा है?

उत्तर

4

चर वीएआर आप $ -e के माध्यम से चर का उपयोग करता है, तो गूंज के लिए एक कमांड लाइन विकल्प के रूप में व्याख्या की है, -e xyz शामिल हैं। ध्यान दें कि $ VAR की सामग्री स्वचालित रूप से लिपटे नहीं है।

अपनी समस्या को ठीक करने के लिए "$ VAR" गूंज का उपयोग करें।

3

प्रयास करें:

echo "$VAR" 
बजाय

(-eecho के लिए एक वैध विकल्प है - यह इस घटना का कारण बनता है)।

0

-e को गूंजने के लिए तर्क के रूप में व्याख्या किया जा रहा है। प्रयास करें

echo "$VAR" 
37

उद्धरणों में $VAR डालने का उत्तर केवल दुष्प्रभावों से सही है। यही है, जब उद्धरण में डाल दिया जाता है, echo(1)-e xyz का एक भी तर्क प्राप्त करता है, और चूंकि यह वैध विकल्प स्ट्रिंग नहीं है, echo बस इसे प्रिंट करता है। यह एक दुष्प्रभाव है क्योंकि echo विकृत विकल्पों के बारे में एक त्रुटि को आसानी से प्रिंट कर सकता है। अधिकांश कार्यक्रम ऐसा करेंगे, लेकिन ऐसा लगता है कि जीएनयू echo (coreutils से) और bash में बनाया गया संस्करण बस एक हाइफ़न से शुरू होने वाले स्ट्रिंग को प्रतिबिंबित करता है लेकिन मान्य तर्क स्ट्रिंग नहीं है। यह व्यवहार दस्तावेज नहीं है इसलिए इसे भरोसा नहीं किया जाना चाहिए।

इसके अलावा, अगर $VAR एक वैध echo विकल्प तर्क होता है, तो के हवाले से $ वीएआर में मदद मिलेगी नहीं:

$ VAR="-e" 
$ echo "$VAR" 

$ 

अधिकांश जीएनयू कार्यक्रमों एक तर्क के रूप -- लेने कोई और अधिक विकल्प प्रसंस्करण मतलब करने के लिए - सभी तर्कों -- के बाद गैर विकल्प तर्क के रूप में संसाधित किया जाना है। bash echo इसका समर्थन नहीं करता है ताकि आप इसका उपयोग नहीं कर सकें। यहां तक ​​कि अगर ऐसा होता है, तो यह पोर्टेबल नहीं होगा। echo में अन्य पोर्टेबिलिटी समस्याएं हैं (-n बनाम \c, -e)।

सही और पोर्टेबल समाधान printf(1) का उपयोग करना है।

printf "%s\n" "$VAR" 
+0

अधिकतर सही उत्तर। हालांकि POSIX मानक स्पष्ट रूप से कहता है "कार्यान्वयन किसी भी विकल्प का समर्थन नहीं करेगा", ऐतिहासिक रूप से कार्यान्वयन का हिस्सा समर्थन विकल्प (मानक का उल्लंघन) करता है। तो 'printf' सही समाधान है,' echo' वास्तव में "हैलो वर्ल्ड" जैसे कुछ स्थिर तारों को आउटपुट करने के लिए उपयोग किया जाना चाहिए, जो आपको पता है कि डैश या बैकस्लाश नहीं हैं। –

+0

ग्रेट उत्तर। थोड़ी देर के लिए इसे समझने की कोशिश कर रहे थे। धन्यवाद। –

+0

यदि आप 'echo' का उपयोग करने के लिए नरक हैं, तो आप बचने के अनुक्रम' echo -e '\ 055e'' का उपयोग कर सकते हैं। – dosentmatter

संबंधित मुद्दे