2015-07-04 7 views
7

निम्न स्क्रिप्ट एक अप्रत्याशित उत्पादन झुकेंगे: उबंटू 14 के तहत एक पार्टी स्क्रिप्ट के रूप मेंमैं बैश प्रिंटफ़ में बैकस्लाश की श्रृंखला से कैसे बचूं?

printf "escaped slash: \\ \n" 
printf "2 escaped slashes: \\\\ \n" 
printf "3 escaped slashes: \\\\\\ \n" 
printf "4 escaped slashes: \\\\\\\\ \n" 

भागो, मैं देख रहा हूँ:

escaped slash: \ 
2 escaped slashes: \ 
3 escaped slashes: \\ 
4 escaped slashes: \\ 

अं .. क्या?

उत्तर

4

यह मानते हुए कि printfFORMAT स्ट्रिंग दोहरे उद्धरण चिह्नों से घिरा हुआ है, printf की तुलना में, विस्तार से एक अतिरिक्त स्तर लेता है जैसे echo (दोनों शैल बिल्टिन कमांड हैं)।

आप printf से क्या उम्मीद वास्तव में एकल उद्धरण का उपयोग कर प्राप्त किया जा सकता:

printf '1 escaped slash: \\ \n' 
printf '2 escaped slashes: \\\\ \n' 
printf '3 escaped slashes: \\\\\\ \n' 
printf '4 escaped slashes: \\\\\\\\ \n' 

आउटपुट:

1 escaped slash: \ 
2 escaped slashes: \\ 
3 escaped slashes: \\\ 
4 escaped slashes: \\\\ 
+0

नोट यह काम करता है क्योंकि आप 'printf' तर्क को देखने से पहले किसी भी बैकस्लैश को हटाने से' bash' को रोकते हैं। – chepner

+0

@chepner: मैं सहमत हूं। ऐसा लगता है कि मूल्यांकन का क्रम है: 1) 'bash' 'FORMAT' स्ट्रिंग * का विस्तार करता है * (केवल डबल कोट्स से घिरा हुआ है!) *। 2) 'printf'' ARGUMENTS' और 'FORMAT' को एक स्ट्रिंग में जोड़ती है। 3) अंतिम स्ट्रिंग फिर से विस्तारित किया जाता है (यानी \\ बन जाता है \)। 4) परिणाम आखिरकार मुद्रित है। –

+0

बंद करें; 'printf' केवल तर्कों को सम्मिलित करने से पहले 'FORMAT' को संसाधित करता है; 'printf '% s' '\ n'' के साथ' printf '\ n'' की तुलना करें। – chepner

3

printf एक बैश बिल्टिन है। help printf पर देखें:

 
printf [-v var] format [arguments] 
     Formats and prints ARGUMENTS under control of the FORMAT. 

आपको प्रारूप और तर्क पास करना चाहिए। तो तर्क से पहले प्रारूप "%s\n" जोड़ें:

printf "%s\n" "escaped slash: \\" 
printf "%s\n" "2 escaped slashes: \\\\" 
printf "%s\n" "3 escaped slashes: \\\\\\" 
printf "%s\n" "4 escaped slashes: \\\\\\\\" 

आउटपुट:

 
escaped slash: \ 
2 escaped slashes: \\ 
3 escaped slashes: \\\ 
4 escaped slashes: \\\\ 
+0

@Yuri जी .: आपके अतिरिक्त वर्णन के लिए धन्यवाद। – Cyrus

+0

नोट यह काम करता है क्योंकि आप बैकस्लाश की व्याख्या के दूसरे दौर को लागू करने वाले 'printf' से बचते हैं। – chepner

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