खोज…


वाक्य - विन्यास

  • 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 के मूल्य को विभाजित करेगा और इसे क्रमशः रेखा से दर्शाएगा।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow