2011-12-20 24 views
10

वहाँ कि मैं यहाँ पर चर्चा करना चाहते लाइन द्वारा एक फ़ाइल लाइन पढ़ने के दो तरीके हैं:बैश जबकि पाश है कि लाइन द्वारा फ़ाइल लाइन पढ़ता

#!/bin/bash  

while read line  
do  
    echo-e "$ line \ n"  
done <file.txt 

और

#!/bin/bash  
exec 3<file.txt 

while read line  
do  
    echo-e "$ line \ n"  
done 

तो पहले संस्करण ठीक काम करता है लेकिन फ़ाइल के साथ लूप करते समय मैं काम करने की तंत्र को समझ नहीं पा रहा हूं। लेकिन दूसरे संस्करण की तंत्र मैं समझता हूं। लेकिन यहां मुझे समझ में नहीं आता कि यह क्यों लटका है और कुछ भी प्रिंट नहीं करता है।

उत्तर

9

पहले पाश काम करता है क्योंकि done के बाद पुनर्निर्देशन पूरे पाश पर लागू होता है, इसलिए read, फ़ाइल से वहाँ पढ़ रही है स्क्रिप्ट के मानक इनपुट से नहीं।

दूसरा संस्करण लटकता है क्योंकि read फ़ाइल डिस्क्रिप्टर 0 से पढ़ता है, जो मानक इनपुट है, और आपने वहां कुछ भी टाइप नहीं किया है। exec लाइन फ़ाइल से पढ़ने के लिए फ़ाइल वर्णनकर्ता 3 पुनर्निर्देश, लेकिन आप फ़ाइल वर्णनकर्ता से पढ़ नहीं कर रहे हैं 3.

आप का उपयोग करके दूसरे को बचाने के सकता है:

exec <file.txt 

अब मानक इनपुट से पढ़ी जाती है नामित फाइल

3

आपकी लिपियों में कुछ गलतियां हैं।

    $ और चर नाम के बीच अंतरिक्ष
  1. । (खराब संपादन हो सकता है)
  2. echo और -e के बीच की जगह। (खराब संपादन हो सकता है)
  3. फ़ाइल डिस्क्रिप्टर पर पढ़ने का उल्लेख जहां फ़ाइल खुली है। आप वर्णनकर्ता 0 और कार्यकारी पर फ़ाइल पढ़ रहे हैं वर्णनकर्ता 3.

पर चल रहा है वह कुछ इस तरह होना चाहिए -

#!/bin/bash  
exec 3<file.txt 

while read line 
do 
    echo -e "$line \n" 
done <&3 
+1

करता है '<और 3'' read' लाइन काम पर? वास्तविक बोर्न शेल के बुरे पुराने दिनों में यह मामला होता था, कि लूप के चारों ओर हर बार पुनर्निर्देशन किया जाएगा, इसलिए आपको मजाकिया प्रभाव मिलते हैं (जैसे फ़ाइल प्रत्येक पुनरावृत्ति पर बंद हो रही है)। मैं अच्छी तरह से विश्वास कर सकता हूं कि तब से इसे संशोधित किया गया है ताकि चीजें थोड़ा और अधिक काम कर सकें। * एफडब्ल्यूआईडब्लू *: जब मैंने मैकोज़ एक्स पर 'बाश' की कोशिश की, तो: '' लाइन पढ़ने के दौरान

+0

धन्यवाद जॉन, मैंने उपरोक्त लिपि के साथ प्रयास किया, यह मेरे मैक पर काम किया। http://cl.ly/ClDf लेकिन कुछ उपयोगी जानकारी है। मुझे याद है। मैं अभी भी बैश के लिए बहुत नया हूँ।अभी 'awk' और' sed' सीख रहा है। लेकिन बैश मूल बातें पर कुछ किताबें शुरू करेंगे। :) –

+0

'read' कथन के बजाय 'done' कथन के बाद' <& 3' होने का उत्तर संपादित किया है। –

4

यह आप के लिए काम कर सकते हैं:

exec 3<file.txt 

while read -u3 line 
do 
    echo -e "$line \n" 
done 

-u3 फ़ाइल डिस्क्रिप्टर 3

अजीब है कि echo में पूरक स्विच पसंद नहीं है ई ksh's print कमांड।

0

-u3 मेरा उद्देश्य के लिए महान (केवल निम्न पंक्ति को पढ़ने) है

#!/bin/bash 

logs=(*Logs.txt) 
[[ -e "${logs[0]}" ]] || exit 0 

exec 3<"${logs[0]}" 

while read -u3 line 
do 
     if [[ $(echo "$line"| grep -c SCSI_STATUS_CHECK_CONDITION) -eq 1 ]]; then 
       read -u3 line 
       echo "$line" 
     fi 
done 
संबंधित मुद्दे