में आईएफएस शब्द विभाजन को नियंत्रित करने के लिए कैसे मैं यह पता लगाने की कोशिश कर रहा हूं कि आईएफएस बैश में शब्द विभाजन को कैसे प्रभावित करता है। व्यवहार संदर्भ ऐसे तरीके से निर्भर है जो शब्द विभाजन के अंतर्ज्ञान से मेल नहीं खाता है।बैश
सामान्य विचार काफी सरल लगता है। बैश मैन पेज से उद्धरण:
शैल आईएफएस के प्रत्येक चरित्र को एक डिलीमीटर के रूप में मानता है, और अन्य पात्रों के परिणामों को इन पात्रों के शब्दों में विभाजित करता है। ... ध्यान दें कि यदि कोई विस्तार नहीं होता है, तो कोई विभाजन नहीं किया जाता है।
यह आईएफएस वैरिएबल को ',' पर सेट करके और अल्पविराम से अलग तर्क सूची के साथ एक खोल फ़ंक्शन का आविष्कार करके उदाहरण के लिए आसानी से सत्यापित किया जा सकता है।
echo_n() {
echo Num args: $#, Args: "[email protected]"
}
(IFS=','
args=foo,bar,baz
echo_n $args
)
उम्मीद तीन अलग बहस में इस परिणाम echo_n को
Num args: 3, Args: foo bar baz
अल्पविराम पृथक सूची के साथ सीधे echo_n लागू के रूप में विफल रहता है, क्योंकि कोई विस्तार शुरू हो रहा है। यहां
IFS=, echo_n foo,bar,baz
परिणाम
Num args: 1, Args: foo,bar,baz
ऊपर में चीजों को नहीं बल्कि पीला पड़ लगते हैं, लेकिन मैं उनके आसपास मेरे सिर लपेटो कर सकते हैं। जब हम तस्वीर में लूप के लिए जोड़ना शुरू करते हैं, तो चीजें बालों वाली होती हैं।
(IFS=,; for i in foo,bar,baz ; do echo_n $i; done)
परिणाम
Num args: 3, Args: foo bar baz
जो पाश के लिए करने के उद्देश्य धरा में।
अब, मैं आईएफएस शब्द विभाजन को मजबूर कर सकता हूं जहां मैं इसे कई बाश चालों के माध्यम से करना चाहता हूं जो विस्तार के कुछ रूप को ट्रिगर करने के लिए मजबूर करते हैं।
Num args: 1, Args: foo
Num args: 1, Args: bar
Num args: 1, Args: baz
में
(IFS=,; for i in ${NO_VAR:-foo,bar,baz} ; do echo_n $i; done)
परिणाम (चाल एक डिफ़ॉल्ट मान के साथ एक अपरिभाषित चर NO_VAR का मूल्यांकन करने में होते हैं।)
एक और इसी तरह की चाल, आदेश प्रतिस्थापन पर निर्भर:
उदाहरण के लिए(IFS=,; for i in $(echo foo,bar,baz) ; do echo_n $i; done)
तो यहां सवाल है: अनुशंसित, बेवकूफ तरीका टी क्या है o उस संदर्भ को नियंत्रित करें जहां आईएफएस शब्द विभाजन किया जाता है?