कुछ मामले क्या हैं जो बैश (या अन्य शेल) स्क्रिप्ट में रिक्त स्थान की संख्या को मायने रखते हैं


14

मुझे बताया गया है कि रिक्त स्थान bashया अन्य शेल लिपियों में महत्वपूर्ण हैं और मुझे रिक्त स्थान के अस्तित्व को नहीं बदलना चाहिए जब तक कि मुझे नहीं पता कि मैं क्या कर रहा हूं। "अस्तित्व को बदलने" मैं या तो दो गैर-स्पेस वर्णों के बीच रिक्ति डालने मतलब या दो गैर-स्पेस वर्णों के बीच रिक्ति को दूर करने, जैसे बदलकर var="$val"करने के लिए var ="$val"विपरीत या उपाध्यक्ष। मै पूछना चाहता हु

क्या ऐसे कोई मामले हैं जिनमें एकल स्थान का उपयोग करना या शेल स्क्रिप्ट में कई लगातार रिक्त स्थान का उपयोग करने से फर्क पड़ता है?

(बेशक डालने / उद्धरण में एक अंतरिक्ष को हटाने के लिए एक अंतर है, से बदल रहा है की तरह बना देता है echo "a b"करने के लिए echo "a b"या विपरीत उपाध्यक्ष। मैं इस तुच्छ उदाहरण के अलावा अन्य उदाहरण के लिए देख रहा हूँ।)

मैं इस सवाल पर आया हूं लेकिन यह दो गैर-अंतरिक्ष वर्णों के बीच रिक्त स्थान को जोड़ने और हटाने के बारे में है, जिसके लिए मुझे कई उदाहरण पता हैं कि इससे कोई फर्क पड़ेगा।

किसी भी सहायता की सराहना की जाएगी। यदि संभव हो तो गोले की अधिक किस्में शामिल करें।

जवाबों:


19

उद्धरण के बाहर, शेल एक शब्द / टोकन विभाजक के रूप में व्हाट्सएप (रिक्त स्थान, टैब, न्यूलाइन, गाड़ी-वापसी, आदि) का उपयोग करता है। इसका मत:

  • व्हॉट्सएप से अलग न होने वाली चीजों को एक "शब्द" माना जाता है ।
  • एक या अधिक व्हाट्सएप पात्रों द्वारा अलग की गई चीजों को दो (या अधिक) शब्द माना जाता है।

प्रत्येक "चीज़" के बीच व्हाट्सएप चार्ट की वास्तविक संख्या कोई फर्क नहीं पड़ता, जब तक कि कम से कम एक न हो।


धन्यवाद। मुझे स्वयं कोई भी काउंटर उदाहरण नहीं मिल रहा है। मैं सिर्फ यह सुनिश्चित करना चाहता हूँ।
वीजुन झोउ

2
बैश फॉर्म फीड्स और वर्टिकल टैब को भी व्हॉट्सएप मानते हैं।
fpmurphy

सच। मैंने मूल रूप से '... newlines, आदि' लिखा और फिर इसे स्पष्ट रूप से गाड़ी-रिटर्न जोड़ने के लिए बदल दिया। गलती से 'आदि' छोड़ दिया।
कैस

क्या होगा यदि रिक्त स्थान की संख्या इतनी बड़ी है, कि कार्यक्रम स्मृति में फिट नहीं हो सकता है?
Worse_Username

7
@Worse_Username व्हॉट्सएप को मेमोरी में फिट होने की आवश्यकता नहीं है। मैंने अभी 8GB रैम और 20GB स्वैप के साथ एक मशीन पर 48GB स्क्रिप्ट बनाई है। यह ठीक चला। उस व्हाट्सएप के माध्यम से सभी को क्रंच करने में 3 मिनट का समय लगता था, लेकिन अंत में यह सफलतापूर्वक echoकमांड और तर्क के बीच उस व्हाट्सएप के साथ एक कमांड चलाता था ।
कैस्परल्ड

23

यह शायद धोखा है, लेकिन यह:

rm foo\ bar         # "delete the file named 'foo bar'"

इससे अलग है:

rm foo\  bar        # "delete the files named 'foo ' and 'bar'"

भले ही रिक्त स्थान उद्धरण में नहीं हैं । ;-)

अधिक उलझन में, यह:

rm \
    foo          # "delete the file named 'foo'"

इससे अलग है:

rm \ 
    foo          # "delete the file named ' ', then run the command 'foo'"

हालांकि वे समान दिखते हैं!


भले ही रिक्त स्थान उद्धरण में नहीं हैं, फिर भी बैकस्लैश कार्यात्मक रूप से उद्धरण के समान है और मैं इसे प्रश्न के "तुच्छ उदाहरण" के रूप में उसी श्रेणी में डालूंगा। (हालांकि यह दिलचस्प है।)
डेविड जेड

12

हम अंतरिक्ष चरित्र (के बारे में बात नहीं करते हैं U+0020), लेकिन किसी भी खाली स्थान के चरित्र ( U+0020, \n, \tयहाँ-दस्तावेज:, आदि), तो एक विशेष मामले मेरे मन में आते हैं।

यह कोड (रिक्त स्थान का उपयोग करके):

cat <<- 'EOF'
<space><space>foo
EOF

प्रिंट होगा:

  foo

लेकिन यह कोड (टैब का उपयोग करके):

cat <<- 'EOF'
<tab><tab>foo
EOF

प्रिंट होगा:

foo

ऐसा इसलिए है क्योंकि ( POSIX राज्यों के रूप में ):

यदि पुनर्निर्देशन ऑपरेटर है <<-, तो सभी प्रमुख <टैब> वर्ण इनपुट लाइनों और रेखा से पीछे हटने वाले सीमांकक से छीन लिए जाएंगे।


1
यह दिलचस्प है। मैंने यहां दस्तावेजों के बारे में सोचा, लेकिन <<-ऑपरेटर को नहीं पता था । आपका बहुत बहुत धन्यवाद।
वीजुन झोउ

यहाँ दस्तावेज़ उद्धृत पाठ का एक रूप है, न कि शेल कोड। शेल शब्द-विभाजन लागू नहीं होता है।
कैस

2

असाइनमेंट स्टेटमेंट लिखते समय इसका असर भी होता है। जैसे अगर मैं कहता हूं कि FOO=xyzयह एक पर्यावरण वैरिएबल बनाएगा जिसका नाम FOOवैल्यू होगा xyz, लेकिन अगर मैं एक स्पेस के साथ बराबरी को अलग कर दूं, तो यह सोचेगा कि मैं FOOarg के साथ एक प्रोग्राम नाम रख रहा हूं =xyz। तो यह बात है जब यह कुछ वाक्य रचना की बात आती है।


आमतौर पर FOO=xyzएक आंतरिक शेल चर बनाता है, लेकिन एक पर्यावरण चर नहीं है। आपको set -aया उसके export FOO=xyzलिए (यानी इसे गैर-उप-उपप्रजातियों के वातावरण का हिस्सा बनाना) चाहिए।
हाऊक लैजिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.