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>
$var
4 तर्कों में विभाजित है, एक भी तर्क नहीं।
क्या, कब और क्यों?
जब शेल पैरामीटर विस्तार , कमांड प्रतिस्थापन , चर या अंकगणितीय विस्तार करता है , तो यह परिणाम में शब्द सीमाओं के लिए स्कैन करता है। यदि कोई शब्द सीमा पाया जाता है, तो परिणाम उस स्थिति में कई शब्दों में विभाजित होता है। शब्द सीमा एक शेल चर 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
के मूल्य को विभाजित करेगा और इसे क्रमशः रेखा से दर्शाएगा।