Bash
शब्द विभाजन
खोज…
वाक्य - विन्यास
- IFS को नई पंक्ति में सेट करें: IFS = $ '\ n'
- IFS को nullstring पर सेट करें: IFS =
- IFS को / वर्ण पर सेट करें: IFS = /
पैरामीटर
| पैरामीटर | विवरण |
|---|---|
| भारतीय विदेश सेवा | आंतरिक क्षेत्र विभाजक |
| -एक्स | प्रिंट कमांड और उनके तर्क जैसे ही वे निष्पादित होते हैं (शेल विकल्प) |
टिप्पणियों
- असाइनमेंट के दौरान शब्द विभाजन नहीं किया जाता है जैसे कि
newvar=$var - शब्द विभाजन
[[ ... ]]निर्माण में नहीं किया जाता है - शब्द विभाजन को रोकने के लिए चर पर दोहरे उद्धरण चिह्नों का उपयोग करें
IFS के साथ विभाजन
और अधिक स्पष्ट होने के लिए, आइए showarg नामक एक लिपि showarg :
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
अब अंतर देखते हैं:
$ var="This is an example"
$ showarg $var
4 args: <This> <is> <an> <example>
$varको 4 args में विभाजित किया गया है।IFSश्वेत अंतरिक्ष वर्ण है और इस प्रकार शब्द विभाजन में रिक्त स्थान हुआ
$ var="This/is/an/example"
$ showarg $var
1 args: <This/is/an/example>
उपरोक्त शब्द में विभाजन इसलिए नहीं हुआ क्योंकि
IFSवर्ण नहीं मिले थे।
अब IFS=/ सेट करें IFS=/
$ IFS=/
$ var="This/is/an/example"
$ showarg $var
4 args: <This> <is> <an> <example>
$var4 तर्कों में विभाजित है, एक भी तर्क नहीं।
क्या, कब और क्यों?
जब शेल पैरामीटर विस्तार , कमांड प्रतिस्थापन , चर या अंकगणितीय विस्तार करता है , तो यह परिणाम में शब्द सीमाओं के लिए स्कैन करता है। यदि कोई शब्द सीमा पाया जाता है, तो परिणाम उस स्थिति में कई शब्दों में विभाजित होता है। शब्द सीमा एक शेल चर IFS (आंतरिक क्षेत्र विभाजक) द्वारा परिभाषित की गई है। IFS के लिए डिफ़ॉल्ट मान स्पेस, टैब और न्यूलाइन है, अर्थात शब्द विभाजन इन तीन सफेद अंतरिक्ष वर्णों पर होगा यदि स्पष्ट रूप से रोका नहीं गया है।
set -x
var='I am
a
multiline string'
fun() {
echo "-$1-"
echo "*$2*"
echo ".$3."
}
fun $var
उपरोक्त उदाहरण में यह है कि fun फ़ंक्शन को कैसे निष्पादित किया जा रहा है:
fun I am a multiline string
$varको 5 args में विभाजित किया गया है, केवलI,amऔरaको प्रिंट किया जाएगा।
IFS और शब्द विभाजन
बंटवारे को शब्द के लिए IFS की संबद्धता के बारे में क्या, कब और क्यों पता नहीं है
आइए IFS को केवल अंतरिक्ष वर्ण में सेट करें:
set -x
var='I am
a
multiline string'
IFS=' '
fun() {
echo "-$1-"
echo "*$2*"
echo ".$3."
}
fun $var
इस बार शब्द विभाजन केवल रिक्त स्थान पर काम करेगा। fun फ़ंक्शन को इस तरह निष्पादित किया जाएगा:
fun I 'am
a
multiline' string
$varको 3 args में विभाजित किया गया है।I,am\na\nmultilineऔरstringमुद्रित किया जाएगा
आइएफएस को केवल नई पंक्ति में सेट करें:
IFS=$'\n'
...
अब fun को अंजाम दिया जाएगा:
fun 'I am' a 'multiline string'
$varको 3 args में विभाजित किया गया है।I am,a,multiline stringमुद्रित किया जाएगा
आइए देखें कि क्या होता है अगर हम IFS को अशक्त करने के लिए सेट करते हैं:
IFS=
...
इस बार की fun को इस तरह से अंजाम दिया जाएगा:
fun 'I am
a
multiline string'
$varका विभाजन नहीं हुआ है अर्थात यह एक एकल arg बना रहा।
आप IFS को nullstring पर सेट करके शब्द विभाजन को रोक सकते हैं
शब्द विभाजन को रोकने का एक सामान्य तरीका दोहरे उद्धरण का उपयोग करना है:
fun "$var"
ऊपर चर्चा किए गए सभी मामलों में शब्द विभाजन को रोक देगा अर्थात केवल एक तर्क के साथ fun फ़ंक्शन को निष्पादित किया जाएगा।
शब्द विभाजन के बुरे प्रभाव
$ a='I am a string with spaces'
$ [ $a = $a ] || echo "didn't match"
bash: [: too many arguments
didn't match
[ $a = $a ]रूप में व्याख्या की गई थी[ I am a string with spaces = I am a string with spaces ]।[testकमांड है जिसके लिएI am a string with spacesएक भी तर्क नहीं है, बल्कि यह 6 तर्क हैं !!
$ [ $a = something ] || echo "didn't match"
bash: [: too many arguments
didn't match
[ $a = something ]रूप में व्याख्या की गई थी[ I am a string with spaces = something ]
$ [ $(grep . file) = 'something' ]
bash: [: too many arguments
grepकमांड रिक्त स्थान के साथ एक बहु-स्ट्रिंग स्ट्रिंग लौटाता है, इसलिए आप बस कल्पना कर सकते हैं कि कितने तर्क हैं ...: D
बुनियादी बातों के लिए क्या, कब और क्यों देखें।
शब्द विभाजन की उपयोगिता
कुछ मामले हैं जहां शब्द विभाजन उपयोगी हो सकता है:
भरने सरणी:
arr=($(grep -o '[0-9]\+' file))
यह फ़ाइल में पाए गए सभी संख्यात्मक मानों के साथ
arrको भर देगा
जगह अलग शब्दों के माध्यम से लूपिंग:
words='foo bar baz'
for w in $words;do
echo "W: $w"
done
आउटपुट:
W: foo
W: bar
W: baz
पासिंग स्पेस अलग पैरामीटर जिसमें सफेद स्पेस नहीं है:
packs='apache2 php php-mbstring php-mysql'
sudo apt-get install $packs
या
packs='
apache2
php
php-mbstring
php-mysql
'
sudo apt-get install $packs
यह संकुल स्थापित करेगा। यदि आप
$packsको दोगुना करते$packsतो यह एक त्रुटि है।
Unquoetd
$packsअंतरिक्ष के लिए तर्क के रूप में पैकेज के नाम अलग सब भेज रहा हैapt-getके हवाले करते हुए इसे भेज देंगे$packsएक भी तर्क के रूप में स्ट्रिंग और फिरapt-getएक पैकेज नामित स्थापित करने का प्रयास करेंगेapache2 php php-mbstring php-mysql(पहले एक के लिए) जो स्पष्ट रूप से मौजूद नहीं है
बुनियादी बातों के लिए क्या, कब और क्यों देखें।
विभाजक परिवर्तन से विभाजन
हम उदाहरण के रूप में अंतरिक्ष से नई लाइन में विभाजकों का सरल प्रतिस्थापन कर सकते हैं।
echo $sentence | tr " " "\n"
यह चर sentence के मूल्य को विभाजित करेगा और इसे क्रमशः रेखा से दर्शाएगा।