echo
एक echoकार्यान्वयन जो कड़ाई से एकल यूनिक्स विशिष्टता के अनुरूप है यदि आप करते हैं
echo 'line1\nline2'
लेकिन यह एक विश्वसनीय व्यवहार नहीं है। वास्तव में, वास्तव में कोई मानक व्यवहार नहीं है जिसकी आप अपेक्षा कर सकते हैं echo।
ऑपरेंड
string
मानक उत्पादन के लिए लिखी जाने वाली एक स्ट्रिंग। यदि पहला ऑपरेंड है -n, या यदि किसी भी ऑपरेंड में < \backslash> चरित्र है, तो परिणाम कार्यान्वयन-परिभाषित हैं ।
पर XSI-conformant प्रणाली, अगर पहले संकार्य है -n, यह एक स्ट्रिंग, माना जाएगा एक विकल्प नहीं है । निम्नलिखित वर्ण अनुक्रम XSI- अनुरूप प्रणाली में किसी भी तर्क के भीतर पहचाने जाएंगे:
\a- एक <अलर्ट> लिखें ।
\b- एक <backspace> लिखें ।
\c- <newline> को दबाएं जो आउटपुट में अंतिम तर्क का अनुसरण करता है। \cतर्कों में निम्नलिखित सभी पात्रों को अनदेखा किया जाएगा।
\f- एक <form-feed> लिखें ।
\n- एक <newline> लिखें ।
\r- एक <गाड़ी-वापसी> लिखें ।
\t- एक <टैब> लिखें ।
\v- एक <ऊर्ध्वाधर-टैब> लिखें ।
\\- एक <backslash> वर्ण लिखें ।
\0num- एक 8-बिट वैल्यू लिखें जो शून्य, एक, दो या तीन अंकों वाला ऑक्टल नंबर हो num।
और इसलिए वास्तव में यह जानने का कोई सामान्य तरीका नहीं है कि कैसे एक नई पंक्ति के साथ लिखना है echo, सिवाय इसके कि आप आम तौर पर ऐसा echoकरने के लिए बस भरोसा कर सकते हैं ।
एक bashशेल आमतौर पर विनिर्देश के अनुरूप नहीं होता है , और -nऔर अन्य विकल्पों को संभालता है , लेकिन यह भी अनिश्चित है। तुम कर सकते हो:
shopt -s xpg_echo
echo hey\\nthere
hey
there
और यह भी आवश्यक नहीं है किbash बिल्ड-टाइम विकल्प के साथ बनाया गया है ...
--enable-xpg-echo-default
विकल्प की echoआवश्यकता के बिना, अंतर्निहित डिफ़ॉल्ट रूप से अंतर्निहित वर्णों का विस्तार करें -e। यह xpg_echoशेल विकल्प के डिफ़ॉल्ट मान को सेट करता है on, जो बैश echoको एकल यूनिक्स विनिर्देश में निर्दिष्ट संस्करण की तरह अधिक व्यवहार करता है, संस्करण 3. बश बिल्डिंस देखें , जो भागने वाले दृश्यों के विवरण के लिए है echo।
printf
दूसरी ओर, printfव्यवहार बहुत तुलनात्मक है।
औचित्य
printfउपयोगिता कि ऐतिहासिक द्वारा प्रदान की गई है कार्यक्षमता प्रदान करने के लिए जोड़ा गया था echo। हालांकि, अतिरिक्त के विभिन्न संस्करणों में अपूरणीय अंतर के कारण echo, संस्करण में कुछ विशेष विशेषताएं हैं, जो इस नई printfउपयोगिता को छोड़ती हैं , जो कि नौवें संस्करण प्रणाली में एक पर आधारित है।
अतिरिक्त विवरण अनुभाग printf()आईएसओ सी मानक में लगभग फ़ंक्शन से मेल खाता है , हालांकि इसे XBD फ़ाइल स्वरूप संकेतन में फ़ाइल स्वरूप संकेतन के रूप में वर्णित किया गया है ।
यह प्रारूप स्ट्रिंग्स को संभालता है जो इसके तर्कों का वर्णन करता है - जो किसी भी संख्या में हो सकते हैं, लेकिन स्ट्रिंग्स के लिए या तो %bस्ट्रिंग्स या शाब्दिक %sट्रिंग्स बहुत अधिक हैं । %fपहली दलील में ऑर्माट्स से इतर, यह एक %bयेट स्ट्रिंग तर्क की तरह सबसे अधिक व्यवहार करता है, सिवाय इसके कि वह \cभागने से नहीं निपटता ।
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
देखें कि क्यों printfबेहतर है echo? अधिक जानकारी के लिए।
echo() printf
आप अपने खुद के मानकों के अनुरूप लिख सकते echoहैं ...
echo(){
printf '%b ' "$@\n\c"
}
... जो बहुत ज्यादा हमेशा सही काम करना चाहिए स्वचालित रूप से।
वास्तव में, नहीं ... यह \nतर्क की पूंछ में एक शाब्दिक निशान लगाता है यदि अंतिम तर्क एक विषम संख्या में <backsashes> समाप्त होता है ।
लेकिन यह नहीं है:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echoअनिवार्य? आप उपयोग कर सकते हैंprintf।