`IFS = $ '\ n में' \ n 'एक चर है?


12

मुझे लगता है कि newline सेट करने के लिए IFSउपसर्ग के रूप में $ के साथ होना चाहिए

IFS=$'\n'

लेकिन अगर एक बृहदान्त्र सेट, बस

IFS=:

है \nएक चर रहा है?

जवाबों:


21

यही कारण है कि $'...'में bashविस्तार पैरामीटर नहीं है, यह द्वारा शुरू की गई बोली की एक विशेष प्रकार का है ksh93कि उन का विस्तार \n, \x0a, \12एक नई पंक्ति चरित्र के लिए कोड। zshको भी जोड़ा \u000aksh93और bashभी है \cj, जबकि zshहै \C-Jksh93भिन्नताओं का भी समर्थन करता है \x{a}

$कि यह किसी न किसी रूप या विस्तार है एक क्यू है। लेकिन किसी भी मामले में, यह अन्य प्रकार के विस्तार से भिन्न होता है जो इसमें $(जैसे $((1 + 1)), $paramया $(cmd)) का उपयोग करते हैं कि यह दोहरे उद्धरण चिह्नों या यहां दस्तावेजों ( सभी गोले में echo "$'x'"आउटपुट के $'x'बिना अनिर्दिष्ट नहीं है) के अंदर किया जाता है और इसका विस्तार विभाजन के अधीन नहीं है + ग्लोब, यह निश्चित रूप से एक विस्तार ऑपरेटर की तुलना में एक उद्धृत ऑपरेटर के करीब है।

IFS=\nकरने के लिए भारतीय विदेश सेवा स्थापित करेगा n( \एक के हवाले से ऑपरेटर के रूप में व्यवहार किया जाता है) और IFS="\n"या IFS='\n'आईएफएस स्थापित करेगा करने के लिए दो अक्षर बैकस्लैश और n

आप भी उपयोग कर सकते हैं:

IFS='
'

या

IFS="
"

या

IFS=$'
'

एक शाब्दिक न्यू लाइन पारित करने के लिए, कि हालांकि कम सुपाठ्य है (और एक जैसी चीजों का उपयोग कर के अलावा अन्य नहीं देख सकते set listमें viहै कि क्या $IFSहै कि कोड में अन्य रिक्ति वर्ण हैं)।

IFS=:, IFS=':', IFS=":", IFS=$':'करने के लिए पूरी तरह से तैयार आईएफएस :तो यह कोई फर्क नहीं पड़ता है जो आप का उपयोग करें।

$'...': कम से कम द्वारा (बदलाव के साथ) समर्थित है ksh93, zsh, bash, mksh, बिजीबॉक्स sh, FreeBSD shksh93और पाठ के स्थानीयकरण के लिए उपयोग किए जाने वाले उद्धरणों का bashएक $"..."रूप भी है, हालांकि यह शायद ही कभी इस्तेमाल किया जाता है क्योंकि यह पोर्टेबली और मज़बूती से तैनात और उपयोग करने के लिए बोझिल है।

esऔर fishगोले भी उपयोग कर सकते हैं \nउद्धरण के बाहर न्यू लाइन का विस्तार करने के।

कुछ उपकरण जैसे printf, कुछ कार्यान्वयन echoया स्वयं द्वारा awkउन का विस्तार कर सकते \nहैं। उदाहरण के लिए, कोई भी कर सकता है:

printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only

न्यूलाइन वर्ण के आउटपुट के लिए, लेकिन ध्यान दें कि:

IFS = $ (प्रिंटफ '\ n')

काम नहीं करेगा क्योंकि कमांड प्रतिस्थापन ( $(...)) सभी अनुगामी न्यूलाइन वर्णों को स्ट्रिप्स करता है। आप हालांकि उपयोग कर सकते हैं:

eval "$(printf 'IFS="\n"')"

जो काम करता है क्योंकि printfएक "चरित्र में समाप्त होता है , एक नई रेखा नहीं।

अब, पूर्णता के लिए, rcशेल और डेरिवेटिव (जैसे esया akanga) में, $'\n'वास्तव में उस \nचर का विस्तार होता है (एक चर जिसका नाम दो वर्णों का अनुक्रम है \और n)। उन गोले पर कोई सीमा नहीं है कि चर वर्णों के नाम क्या हो सकते हैं और केवल एक प्रकार के उद्धरण हो सकते हैं '...':।

$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo

rcचर भी सभी पर्यावरण के लिए निर्यात किए जाते हैं, लेकिन कम से कम यूनिक्स संस्करण में rc, जैसे चर नामों के लिए \n, पर्यावरण चर संस्करण एन्कोडिंग का एक प्रकार से गुजरता है:

; env | grep foo | sed -n l
__5cn=foo\001bar$

( 0x5cASCII का बाइट मान होने के नाते \, यह भी देखें कि कैसे सरणी चर विभाजक के रूप में 0x1 बाइट के साथ एन्कोड किया गया था)।


1
+1ज्ञान के सामान्य अमानवीय स्तर के लिए
स्टीवन पेनी

10

यह ANSI-C उद्धृत है :

फॉर्म के शब्द $'string'विशेष रूप से व्यवहार किए जाते हैं। यह शब्द stringANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ विस्तारित होता है ।

इस प्रकार $'\n'एक नई पंक्ति द्वारा प्रतिस्थापित किया जाता है।

यह शेल पैरामीटर विस्तार से असंबंधित है , के उपयोग के बावजूद $


6

जैसे स्ट्रिंग्स $'\n'द्वारा पेश किया गया है ksh93और वर्तमान में पोसिक्स मानक का हिस्सा नहीं है।

वे ज्यादातर सी समान रूप से बच निकलने की अनुमति देते हैं, उदाहरण के लिए $'\u2345'और वे पलायन भी जिनका समर्थन किया जाता है echo

ध्यान दें कि यदि आपको उस भागने की विधि का उपयोग करने के लिए (ksh93 या बैश के मामले में) पसंद नहीं है, तो आप अभी भी उपयोग कर सकते हैं:

IFS='
'

जो समकक्ष है लेकिन पढ़ने में कठिन है।

BTW: यह एक्सटेंशन पहले ही POSIX मानक कमिट पास कर चुका है, लेकिन यह SUSv8 के लिए निर्धारित है, जो कि वर्ष 2020 से पहले प्रदर्शित नहीं होने की उम्मीद है क्योंकि हमें पहले कीड़े की वर्तमान सूची के पीछे अपने अंतराल पर काम करने की आवश्यकता है।


$'...'विस्तार की गई जानकारी से भिन्न echo। वे प्रारूप तर्क के लिए लोगों की तरह अधिक हैं printf। के लिए echo, एक 0 की आवश्यकता होती है, \0123जबकि प्रारूप $'...'और printfप्रारूप के लिए, एक नई \0123\012
पंक्ति

1
ध्यान दें कि $'...'विनिर्देश पर अभी भी चर्चा की जा रही है। वर्तमान में प्रस्तावित शब्दों के साथ अभी भी कई मुद्दों का समाधान किया जाना है।
स्टीफन चेज़लस

IIRC, इसे बंद कर दिया गया था लेकिन फिर से खोल दिया गया है। इस तथ्य के कारण कि प्रभावी होने से पहले अभी भी बहुत समय है, मुझे इसके साथ एक वास्तविक समस्या नहीं दिख रही है।
स्किल

1
इसे बंद कर दिया गया, मैंने कई आपत्तियाँ उठाईं, यह फिर से खोल दी गई, फिर इसमें संशोधन किया गया, अभी भी कई समस्याएं हैं ( \uxxxxविस्तार के बारे में उनमें से अधिकांश ), और दृष्टि में कोई संकल्प नहीं है जो मौजूदा कार्यान्वयन को समायोजित करेगा। तो यह अगले POSIX संस्करण में नहीं बना सकता है। शायद वे \uxxxxइश्यू 8 के लिए विस्तार छोड़ सकते हैं , इसलिए हम अभी भी कम से कम हो सकते हैं $'\n'
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.