सिग्विन सिंटेक्स ट्रबल


0

मैं विंडोज 7 पर सिगविन का उपयोग कर रहा हूं।

मेरी स्क्रिप्ट और टेक्स्ट फ़ाइल एक ही डायरेक्टरी में स्थित हैं।

#!/bin/bash
while read name; do
echo "Name read from file - $name"
done < /home/Matt/servers.txt

मुझे यह त्रुटि मिलती है और मुझे नहीं पता कि लूप सिंटैक्स के कारण यह सही क्यों है ..?

u0146121@U0146121-TPD-A ~/Matt
$ ./script.sh
./script.sh: line 4: syntax error near unexpected token `done'
./script.sh: line 4: `done < /home/Matt/servers.txt'

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं? मुझे लगता है कि यह इसलिए है क्योंकि मैं खिड़कियों पर हूं और सिग्विन का उपयोग कर रहा हूं।


क्या आपका मतलब है कि यह यूनिक्स पर काम करता है?
गोलिमार

@ गोलिमार ने कभी इसका परीक्षण नहीं किया
जक

आप लूप के लिए क्यों नहीं करते? IMHO यह बहुत अधिक पठनीय होगा (खेद है कि यह सवाल का जवाब नहीं देता है)
pataluc

@ पाटलुक: क्योंकि while read...अक्सर अनुशंसित विधि है।
विशालकाय जूल

1
डॉस-स्टाइल लाइन एंडिंग के लिए स्क्रिप्ट की जाँच करें cat -v /path/to/scriptऔर इसे लाइनों के अंत में "^ M" के साथ प्रिंट करके देखें । "यह वास्तव में उन त्रुटियों की तरह नहीं दिखता है जो मैं इस से उम्मीद करूंगा, लेकिन साइगविन के साथ यह जांचना सबसे अच्छा है। ।
गॉर्डन डेविसन

जवाबों:


0

पिछला उत्तर सही है कि विंडोज \ r \ n जगह देगा लेकिन * nix सिस्टम केवल \ n ही स्वीकार करेगा। हालाँकि, विंडोज मशीन पर इसे हल करने का एक बेहद आसान तरीका है।

टेक्स्टपैड जैसे टेक्स्ट एडिटर में, "सेव अस" चुनें, और फ़ाइल नाम के तहत आप "लाइन एंडिंग" चुन सकते हैं। यहां, इसे "UNIX" के रूप में सहेजें, और फ़ाइल ठीक से \ r के साथ एन्कोड हो जाएगी और आपके स्क्रैप ठीक काम करेंगे।


0

इस स्क्रिप्ट में CR LF लाइन एंडिंग्स हैं। इसके साथ अधिक दिखाई देता है od

$ od -c script
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   w   h   i
0000020   l   e       r   e   a   d       n   a   m   e   ;       d   o
0000040  \r  \n   e   c   h   o       "   N   a   m   e       r   e   a
0000060   d       f   r   o   m       f   i   l   e       -       $   n
0000100   a   m   e   "  \r  \n   d   o   n   e       <       /   h   o
0000120   m   e   /   M   a   t   t   /   s   e   r   v   e   r   s   .
0000140   t   x   t  \r  \n
0000145

जैसा कि आप देख सकते हैं, मेरे पास \r(कैरिज रिटर्न) और \n(लाइन फीड) अक्षर प्रत्येक पंक्ति के अंत में हैं जहां आपको केवल \nवर्ण होना चाहिए । यह विंडोज और * निक्स सिस्टम के बीच संगतता समस्या का एक परिणाम है। बैश में \rपात्रों के साथ काम करने में कठिनाई होती है।

आप एक उपयोगिता का उपयोग करके dos2unixया निम्न sedकमांड चलाकर अपनी स्क्रिप्ट को ठीक कर सकते हैं :

sed -i 's/\r$//' script
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.