2010-12-08 5 views
10
साथ, फ़ाइल से लाइन द्वारा लाइन पढ़

मैं http://bash.cyberciti.biz/guide/While_loop से इस कोड को एक फ़ाइलबैश, आईएफएस

file=/etc/resolv.conf 
while IFS= read -r line 
do 
     # echo line is stored in $line 
    echo $line 
done < "$file" 

हिस्से से लाइन द्वारा लाइन को पढ़ने के लिए इस्तेमाल किया हो रही है मुझे समझ नहीं आता है IFS= और कैसे यह इस कार्यक्षमता में योगदान देता है। क्या कोई मुझे यह समझा सकता है? धन्यवाद।

+0

[unix.SE] पर [समकक्ष प्रश्न] (http://unix.stackexchange.com/q/209123/22565) देखें। –

उत्तर

-5

आईएफएस लाइन विभाजक (या वास्तव में "आंतरिक क्षेत्र विभाजक") के लिए एक चर है। वह कोड प्रभावी रूप से आपके रीड कमांड के लिए लाइन विभाजक को खाली कर देगा और इसे इसके डिफ़ॉल्ट पर सेट करेगा। कभी-कभी आईएफएस कोड में कहीं और बदल जाता है क्योंकि उपयोगकर्ता अन्य "लाइन" समाप्ति चाहते हैं, जैसे एक समय में एक वाक्य (IFS=.) या इसी तरह पढ़ना।

मुझे लगता है कि वे केवल IFS= शामिल हैं यह सुनिश्चित करने के लिए कि यह काम करता है या हर कोई, IFS चर के पिछले मान के बावजूद। कोड को अभी भी IFS=

+0

यह सच है, 'आईएफएस =' के बिना यह अभी भी ठीक काम कर रहा है। बहुत बहुत धन्यवाद। – wakandan

+0

बस एक त्वरित बात है, हम एक ही पंक्ति में 'IFS = 'और' read -r line' असाइनमेंट डाल सकते हैं? यह अनुमत है? – wakandan

+1

उपयोगकर्ता 121870, हाँ, इसकी अनुमति है। कमांड के सामने वेरिएबल्स डालने पर वे चर केवल उस कमांड पर दिखाई देंगे। यह सभी बैश कमांड पर लागू होता है, यहां तक ​​कि जिन्हें आप अपने टर्मिनल में लिखते हैं। उदाहरण के लिए इस आदेश का प्रयास करें: "MANWIDTH = 20 man bash"। –

3

उस पृष्ठ पर तीसरे उदाहरण में, IFS को शून्य पर शब्द विभाजन को रोकता है जो कोड को काम नहीं करता है। यहाँ है कि कोड है:

while IFS= read -r field1 field2 field3 ... fieldN 
do 
    command1 on $field1 
    command2 on $field1 and $field3 
    .. 
    .... 
    commandN on $field1 ... $fieldN 
done < "/path/to dir/file name with space" 

लिखा के रूप में, लाइन पर सभी शब्दों field1 और field2, आदि में जमा हो जाती, खाली हैं। यह करने के लिए लाइन बदलें और यह ठीक से काम करेगा:

while read -r field1 field2 field3 ... fieldN 
30

इस मामले में, IFS लाइन से प्रमुख और पिछली श्वेत रिक्ति को अलग करना से read को रोकने के लिए रिक्त स्ट्रिंग पर सेट किया जाता है।

IFS बदलना आमतौर पर यह नियंत्रित करने के लिए किया जाता है कि इनपुट को कई क्षेत्रों में कैसे विभाजित किया जाएगा। लेकिन इस मामले में, क्योंकि read को दिए गए केवल एक परिवर्तनीय नाम हैं, readIFS के मान के बावजूद इनपुट को कभी भी कई फ़ील्ड में विभाजित नहीं करेगा। हालांकि, यह POSIX विनिर्देश में अनिवार्य रूप से अग्रणी और पिछली सफेद जगह को हटा देगा (मानते हैं कि IFS का मान व्हाइटस्पेस या अनसेट है)।

यह कैसे काम करता है इसके बारे में विवरण के लिए read और field splitting के लिए POSIX विनिर्देश देखें।

+5

+1। – grok12

-3

IFS एक असली लाइन विभाजक बनाने के लिए, IFS=$'\012' का उपयोग करें।

+1

आपने इस प्रश्न का उत्तर नहीं दिया। प्रश्न कमांड में 'IFS = 'भाग को समझाया गया था, और इसका उपयोग समझाया गया था। और वैसे, 'आईएफएस = $' \ n'' होगा (तर्कसंगत) कम गुप्त। –

+0

काफी सच है। लेकिन उस हिस्से को अनिवार्य रूप से ऊपर उत्तर दिया गया है, और ये गोर विवरण हैं। शायद इस प्रश्न का उत्तर माना जाना चाहिए। – user3673660

+0

यदि प्रश्न का उत्तर पहले ही दिया जा चुका है, तो ऐसे प्रश्नों को जोड़ने में कोई बात नहीं है जो प्रश्न का उत्तर नहीं देते हैं। ओह ठीक है, यह तुम्हारी पसंद है; शायद आप इसके लिए अपवॉट भी प्राप्त करेंगे। या नहीं। रुको और देखो। –