2008-09-03 12 views
6

यहां क्या हो रहा है?बॉर्न शेल printf% s तर्क पर फिर से क्यों होता है?

printf.sh:

#! /bin/sh 
NAME="George W. Bush" 
printf "Hello, %s\n" $NAME 

कमांड लाइन सत्र:

$ ./printf.sh 
Hello, George 
Hello, W. 
Hello, Bush 

अद्यतन: printf "Hello, %s\n" "$NAME" काम करता है। कारण है कि मैं echo उपयोग नहीं करते समय के लिए, पर विचार

echo.sh:

#! /bin/sh 
FILE="C:\tmp" 
echo "Filename: $FILE" 

कमांड लाइन:

$ ./echo.sh 
Filename: C: mp 

POSIX spec for echo कहते हैं, "वे नए एप्लिकेशन के बजाय printf उपयोग करने के लिए प्रोत्साहित किया जाता है echo "(इस और अन्य कारणों से)।

+0

बैश बिल्टिन इको डिफ़ॉल्ट रूप से \ प्रतिस्थापन नहीं करता है, लेकिन पीओएसआईक्स शैल (उदा। डैश) इको करता है, क्योंकि spec के आपके लिंक से संकेत मिलता है।चूंकि आप किसी भी शैल का उपयोग कर रहे हैं, फिर भी आप "हैलो, $ NAME \ n" –

+0

प्रिंट कर सकते हैं असल में,% s का उपयोग करना संभवतः सुरक्षा और शुद्धता कारणों के लिए एक अच्छी आदत है। printf प्रारूप प्रति स्ट्रिंग में \ प्रतिस्थापन और अन्य सामान करेगा, इसलिए जब संभव हो तो चर से बाहर रखें। –

उत्तर

6

आपकी NAME चर इस तरह प्रतिस्थापित किया जा रहा है में $ नाम डाल करने के लिए है का उपयोग कर रखने के लिए man page क्या यह उस स्ट्रिंग को मानता है जिसे आप इसे तर्क मानते हैं; यदि आपकी स्ट्रिंग में रिक्त स्थान हैं तो यह सोचता है कि आप कई तर्क पारित कर रहे हैं। मेरा मानना ​​है कि कॉलिन यॉगर उद्धरण के साथ परिवर्तनीय के आस-पास सही है, जो शैल को स्ट्रिंग को एक तर्क के रूप में समझने के लिए मजबूर करता है।

एक वैकल्पिक printf चर का विस्तार करने देने के लिए हो सकता है:

printf "Hello, $NAME." 

लिंक बैश के लिए कर रहे हैं, लेकिन मैं यकीन है कि श के लिए एक ही रखती हूँ।

0

यदि आप चाहते हैं ये सभी शब्द अपने दम पर बाहर मुद्रित करने के लिए, बजाय प्रिंटprintf

का उपयोग printf स्वरूपण विनिर्देश लेता है और प्रत्येक तर्क है कि आप में पारित करने के लिए यह लागू होता है। चूंकि आपके पास तीन तर्क हैं {जॉर्ज, डब्लू।, बुश}, यह विभिन्न तर्कों का उपयोग करके तीन बार स्ट्रिंग आउटपुट करता है।

+0

प्रिंट (1) एक प्रिंटर को फ़ाइल प्रिंट करने के लिए है, इसके माइम-प्रकार की जांच के बाद। यह बैश में निर्मित एक खोल नहीं है। –

1

क्या कोई विशिष्ट कारण है कि आप printf का उपयोग कर रहे हैं या आपके लिए भी काम गूंजेंगे?

NAME="George W. Bush" 
echo "Hello, "$NAME 

परिणामों में

Hello, George W. Bush 

संपादित करें: कारण इस पर पुनरावृत्ति है "जॉर्ज व। बुश" क्योंकि बॉर्न शैल अंतरिक्ष delimitted है। जिस तरह से मैं व्याख्या

#! /bin/sh 
NAME="George W. Bush" 
printf "Hello, %s\n" "$NAME" 
1

:

printf "Hello, %s\n" George W. Bush 

इस का प्रयोग करें: printf आप दोहरे उद्धरण चिह्नों

printf "Hello, %s\n" "$NAME" 
+0

नहीं, कोई "यह सोचता है" नहीं है। उन्होंने कई तर्क पारित किए, क्योंकि उन्होंने printf कमांड में $ NAME के ​​विस्तार का उद्धरण नहीं दिया था। खोल ने इसे विस्तारित किया, फिर शब्द-विभाजित किया, फिर printf को 3 तर्क पारित किए। लेकिन जैसा कि आप कहते हैं, ColinYounger यह सही है। –