2012-03-13 5 views
5

मेरे पास एक बैश फ़ाइल थी जो उपयोगकर्ता को कुछ पैरामीटर के लिए प्रेरित करती थी और अगर कुछ भी नहीं दिया गया तो डिफ़ॉल्ट का उपयोग किया जाता था। फिर स्क्रिप्ट पैरामीटर के साथ कुछ अन्य आदेश करने के लिए चला गया। यह बहुत अच्छा काम करता है - हालिया अतिरिक्त होने तक कोई समस्या नहीं है।जबकि लूप रीड लाइन के भीतर उपयोगकर्ता से कैसे पढ़ा जाए?

किसी txt फ़ाइल से NAMES पैरामीटर को पढ़ने के प्रयास में, मैंने फ़ाइल में नामों को लेने के लिए थोड़ी देर-लूप जोड़ा है, लेकिन मुझे अभी भी शेष पैरामीटर के लिए संकेत मिलेगा।

लेकिन एक बार जब मैंने लूप जोड़ा, तो आउटपुट मुद्रित संकेत को get_ans() में दिखाता है और कभी भी पढ़ने के लिए रुकता नहीं है, इस प्रकार सभी डिफ़ॉल्ट चयनित होते हैं।

मैं फ़ाइल से पहला पैरामीटर पढ़ना चाहता हूं, फिर उपयोगकर्ता को संकेत देने से सभी बाद की फाइलें पढ़ना चाहूंगा।

मैंने लूप-लूप जोड़कर क्या तोड़ दिया?

cat list.txt | 
while read line 
do 
    get_ans "Name" "$line" 
    read NAME < $tmp_file 

    get_ans "Name" "$line" 
    read NAME < $tmp_file 
done 

function get_ans 
{ 
    if [ -f $tmp_file ]; then 
    rm $tmp_file 

    PROMPT=$1 
    DEFAULT=$2 

    echo -n "$PROMPT [$DEFAULT]: " 
    read ans 
    if [ -z "$ans" ]; then 
    ans="$DEFAULT" 
    fi 
    echo "$ans" > $tmp_file 
} 

:

+0

मैं जिनमें से (एक है आप कैसे स्वीकार करने के लिए निर्णय लेने से पहले समस्या _solve_, यह न सिर्फ क्या है) बताता है कि आपके अन्य उत्तर को देखो चाहते हैं। –

उत्तर

3

आप अपने while loops STDIN में पाइप डेटा। तो readget_ans में भी उस एसटीडीआईएन स्ट्रीम से डेटा ले रहा है।

आप एक अलग फ़ाइल वर्णनकर्ता पर जबकि में पाइप डेटा समस्या से बचने और अस्थायी फ़ाइलों के साथ परेशान कर रहा रोकने के लिए कर सकते हैं:

while read -u 9 line; do 
    NAME=$(get_ans Name "$line") 
done 9< list.txt 

get_ans() { 
    local PROMPT=$1 DEFAULT=$2 ans 
    read -p "$PROMPT [$DEFAULT]: " ans 
    echo "${ans:-$DEFAULT}" 
} 
+0

इसे पढ़ने के साथ मिला <और 9 –

1

(ध्यान दें। कोड & पेस्ट कॉपी नहीं कर रहा है तो लिखने की त्रुटियों के लिए क्षमा करें वास्तविक कोड समारोह से पहले मुख्य() परिभाषित किया गया है) जब आप पाइप एक कमांड लाइन, जैसे पर दूसरे में आदेश:

$ foo | bar 

खोल इसे सेट अप करने के लिए इतना है कि bar रों मानक आउटपुट के मानक इनपुट foo से आता है 'जा रहा है। कुछ भी जो foo stdout पर भेजता है सीधे bar के stdin पर जाएगा।

आपके मामले में, इसका मतलब है कि आपकी स्क्रिप्ट एकमात्र चीज जो पढ़ सकती है वह cat कमांड का मानक आउटपुट है, जिसमें आपकी फ़ाइल की सामग्री शामिल होगी।

कमांड लाइन पर पाइप का उपयोग करने के बजाय, फ़ाइल नाम को अपनी स्क्रिप्ट का पहला पैरामीटर बनाएं। फिर अपने कोड के अंदर फ़ाइल से खोलें और पढ़ें और उपयोगकर्ता से सामान्य के रूप में पढ़ें।

+0

ठीक है, यह समझ में आता है। धन्यवाद –

+0

ठीक है, हटाई गई पाइप और पढ़ने के दौरान उपयोग किया जाता है; करें ... किया <$ 1 और यह अभी भी इनपुट पढ़ना छोड़ रहा है। –

3

टर्मिनल से सीधे पढ़ने के लिए, नहीं stdin से (यह मानते हुए कि आप एक पर हैं * NIX मशीन, नहीं एक Windows मशीन):

while read foo</some/file; do 
    read bar</dev/tty 
    echo "got <$bar>" 
done 
संबंधित मुद्दे