बश की सुरुचिपूर्ण सादगी यह विशाल आदमी पृष्ठ में खो जाती है।
ऊपर दिए गए उत्कृष्ट समाधानों के अलावा, मैंने सोचा कि मैं आपको एक चेस शीट देने की कोशिश करूंगा कि कैसे पर्स और बयानों की व्याख्या की जाए । फिर इस रोडमैप का उपयोग करके मैं प्रश्नकर्ता द्वारा प्रस्तुत किए गए उदाहरणों को बेहतर तरीके से समझने में मदद करने के लिए पार्स करूंगा कि वे उद्देश्य के अनुसार काम क्यों नहीं करते हैं।
नोट: शेल स्क्रिप्ट लाइनों का उपयोग सीधे किया जाता है। टाइप की गई इनपुट-लाइनें पहले इतिहास-विस्तारित हैं।
प्रत्येक बैश लाइन को पहले टोकेनाइज्ड किया जाता है , या दूसरे शब्दों में कटा हुआ जिसे टोकन कहा जाता है । (ब्रेसिंग, टिल्ड, पैरामीटर, कमांड, अंकगणितीय, प्रक्रिया, शब्द विभाजन, और फ़ाइल नाम विस्तार सहित अन्य सभी विस्तार से पहले होता है।)
यहाँ एक टोकन का अर्थ है इन विशेष मेटा-वर्णों में से एक द्वारा अलग की गई इनपुट लाइन का एक भाग (सीमांकित):
space, - White space...
tab,
newline,
‘<’, - Redirection & piping...
‘|’,
‘>’
‘&’, - And/Both < | > | >> .or. &<file descriptor>
‘;’, - Command termination
‘(’, - Subshell, closed by - ‘)’
बैश कई अन्य विशेष पात्रों का उपयोग करता है लेकिन केवल ये 10 प्रारंभिक टोकन का उत्पादन करते हैं।
हालाँकि, क्योंकि इन मेटा-वर्णों को भी कभी-कभी एक टोकन के भीतर उपयोग किया जाना चाहिए, उनके विशेष अर्थ को दूर करने का एक तरीका होना चाहिए। इसे पलायन कहा जाता है। पलायन या तो एक या एक से अधिक वर्णों (जैसे 'xx..'
, "xx.."
) के एक स्ट्रिंग को उद्धृत करके किया जाता है , या किसी व्यक्ति के चरित्र को बैक-स्लैश के साथ जोड़कर (यानी \x
) किया जाता है। (यह इस से थोड़ा अधिक जटिल है क्योंकि उद्धरणों को भी उद्धृत करने की आवश्यकता है, और क्योंकि दोहरे उद्धरण सब कुछ उद्धृत नहीं करते हैं, लेकिन यह सरलीकरण अभी के लिए करेगा।)
अन्य भाषाओं की तरह, टेक्स्ट के एक स्ट्रिंग को उद्धृत करने के विचार से बैश को भ्रमित न करें। बैश में उद्धरणों के बीच में क्या तार नहीं हैं, बल्कि मेटा-वर्णों के अनुभागों के अनुभाग बच गए हैं जिससे वे टोकन को नष्ट नहीं करते हैं।
ध्यान दें, '
और "
, के बीच एक महत्वपूर्ण अंतर है , लेकिन यह एक और दिन के लिए है।
शेष अप्रकाशित मेटा-वर्ण तब टोकन विभाजक बन जाते हैं।
उदाहरण के लिए,
$ echo "x"'y'\g
xyg
$ echo "<"'|'\>
<|>
$ echo x\; echo y
x; echo y
पहले उदाहरण में एक अंतरिक्ष परिसीमा द्वारा निर्मित दो टोकन हैं: echo
और xyz
।
इसी तरह 2 उदाहरण में।
तीसरा उदाहरण अर्धविराम बच रहा है में, तो वहाँ 4 एक अंतरिक्ष सीमांकक, द्वारा उत्पादित टोकन हैं echo
, x;
, echo
, और y
। पहला टोकन तब कमांड के रूप में चलाया जाता है, और इनपुट के रूप में अगले तीन टोकन लेता है। नोट 2 echo
को निष्पादित नहीं किया गया है।
यह ध्यान रखना होगा बचने वर्णों के लिए बैश पहले दिखता है ( '
, "
, और \
), और फिर नहीं छोड़ा जाएगा मेटा-चरित्र सीमांकक के लिए लग रहा है, इसी क्रम में।
यदि बच नहीं गए तो ये 10 विशेष वर्ण परिसीमनकर्ता के रूप में कार्य करते हैं token
। उनमें से कुछ का अतिरिक्त अर्थ भी है, लेकिन सबसे पहले और सबसे महत्वपूर्ण, वे टोकन परिसीमनकर्ता हैं।
Grep क्या उम्मीद करता है
में ग्रेप ऊपर के उदाहरण इन टोकन की जरूरत है, , grep
, ।string
filename
सवाल का पहला प्रयास था:
$ grep (तब | वहाँ) xx
इस मामले में (
, )
और |
नहीं छोड़ा जाएगा मेटा चरित्र है और इन्हें एक टोकन में इनपुट विभाजित करने के लिए की सेवा: grep
, (
, then
, |
, there
, )
, और x.x
। ग्रेप देखना चाहता है grep
, then|there
और x.x
।
प्रश्न का दूसरा प्रयास था:
grep "(तब | वहाँ)" xx
इस में tokenizes grep
, (then|there)
, x.x
। आप इसे देख सकते हैं अगर आप गूंज के लिए बाहर स्वैप करते हैं:
इको "(तब | वहाँ)" xx
(तब | वहाँ) xx