शेल कमांड लाइन इनपुट लाइन स्पेस में अल्पविराम बदल देती है


1

मेरे पास साधारण स्क्रिप्ट है जो इंटरेक्टिव कीबोर्ड से 4 वेरिएबल्स लेती है, 'रीड' हालांकि मेरी कमांड इसमें कॉमा है। मैं IFS विभाजक मूल्य पर पढ़ता हूं, फिर भी उदाहरण केवल कीबोर्ड इनपुट नहीं फाइलों से पढ़ने को दिखाता है। क्या कोई ट्रिक इनपुट बदल रहा है, या क्या मुझे स्क्रिप्ट पढ़ने के लिए सही प्रारूप होने के लिए SED / AWK के माध्यम से कमांड को पाइप करने की आवश्यकता है?

स्क्रिप्ट कुछ भी नहीं फैंसी है, बस इनपुट टेक्स्ट, और यह इनपुट वैल्यू और इकोस बैक कमांड स्ट्रिंग्स जोड़ता है जो कि दर्ज किए गए पाठ के साथ चलाया जा सकता है।

[नेटवर्क] [कार्ड], [पोर्ट] [होस्टनाम] 0123 0123, A1 ABCDEFG

#!/bin/bash
echo "Enter network info:"
read VAR1 VAR2 VAR3 VAR4
#I have no clue what Im doing

echo -e "${green}ping test and ssh into $VAR4${NC}"

जवाबों:


1

अल्पविराम को शब्द विभाजक के रूप में मानने के लिए, प्रयास करें:

IFS="$IFS," read a b c d

यह अस्थायी रूप से एक अल्पविराम जोड़ता है IFS, जो फ़ील्ड विभाजकों के लिए शेल का उपयोग करने वाले पात्रों की सूची है।

एक उदाहरण के रूप में, चलो कुछ इनपुट इकट्ठा करते हैं:

$ IFS="$IFS," read a b c d
1, 2,3 , 4

आइए देखें कि बैश ने उस इनपुट की व्याख्या कैसे की:

$ echo "a=$a b=$b c=$c d=$d"
a=1 b=2 c=3 d=4

सुधार की

हम प्रॉम्प्ट और रीड कमांड को जोड़ सकते हैं:

IFS="$IFS," read -p "Enter network info: " a b c d

प्रलेखन

से man bash:

भारतीय विदेश सेवा
आंतरिक क्षेत्र विभाजक जिसका उपयोग शब्द के लिए किया जाता है   विस्तार के बाद विभाजन और शब्दों के साथ लाइनों को विभाजित करना   बिलिन कमांड पढ़ें। डिफ़ॉल्ट मान है <space><tab><newline>

विकल्प

यदि, किसी अनिर्दिष्ट कारण के लिए, कोई वास्तव में उपयोग करना चाहता था sed इस कार्य के लिए:

read -p "Enter network info: " a b c d < <(sed 's/,/ /g; q')

आदेश s/,/ /g प्रत्येक अल्पविराम को एक स्थान से बदलने के लिए sed को बताता है। q यह पहली पंक्ति के बाद छोड़ने के लिए कहता है।

अकेला < इंगित करता है पुनर्निर्देशन : यह शेल को इसके इनपुट प्राप्त करने के लिए कहता है read कमांड लाइन पर आने वाली फ़ाइल जैसी ऑब्जेक्ट से कमांड।

निर्माण <(...) कहा जाता है प्रक्रिया प्रतिस्थापन और Parens में सम्‍मिलित कमांड से फ़ाइल जैसी ऑब्जेक्ट बनाता है। वह आज्ञा है sed कमांड जो रिक्त स्थान के साथ अल्पविराम की जगह लेती है।

एक ही दृष्टिकोण के लिए लेकिन awk के साथ उपयोग करना:

read -p "Enter network info: " a b c d < <(awk '{gsub(/,/, " "); print; exit}')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.