मैं व्हाट्सएप वर्णों को एक साथ विलय करने से `IFS` के साथ` read` को कैसे रोकूं? [डुप्लिकेट]
इस कोड के टुकड़े को लीजिए जो डेटा द्वारा अलग-अलग पढ़ता है |
DATA1="Andreas|Sweden|27"
DATA2="JohnDoe||30" # <---- UNKNOWN COUNTRY
while IFS="|" read -r NAME COUNTRY AGE; do
echo "NAME: $NAME"; echo "COUNTRY: $COUNTRY";
echo "AGE: $AGE"; done<<<"$DATA2"
उत्पादन:
NAME: JohnDoe
देश:
AGE: 30
यह कोड के इस टुकड़े के लिए अनौपचारिक रूप से काम करना चाहिए , जहां हम एक ही काम कर रहे हैं, बस \t
इसके बजाय एक विभाजक के रूप में उपयोग कर रहे हैं|
DATA1="Andreas Sweden 27"
DATA2="JohnDoe 30" # <---- THERE ARE TWO TABS HERE
while IFS=$'\t' read -r NAME COUNTRY AGE; do echo "NAME: $NAME";
echo "COUNTRY: $COUNTRY"; echo "AGE: $AGE";
done<<<"$DATA2"
लेकिन यह नहीं है।
उत्पादन:
नाम: जॉनडे
देश: 30
उम्र:
बैश, या read
या IFS
या कोड का कोई अन्य हिस्सा व्हाट्सएप पर एक साथ ग्लोबिंग कर रहा होता है जब इसे माना नहीं जाता है। यह क्यों हो रहा है, और मैं इसे कैसे ठीक कर सकता हूं?
जवाब
bash
जैसा व्यवहार करना चाहिए वैसा ही व्यवहार करना चाहिए। से bash
प्रलेखन:
शेल IFS के प्रत्येक चरित्र को एक सीमांकक के रूप में मानता है, और इन वर्णों पर अन्य विस्तार के परिणामों को शब्दों में विभाजित करता है। यदि IFS परेशान है, या इसका मान बिल्कुल
<space><tab><newline>
, डिफ़ॉल्ट है, तो , और<space>
, का अनुक्रम है<tab>
<newline>
पिछले विस्तार के परिणामों की शुरुआत और अंत को नजरअंदाज कर दिया जाता है, और शुरुआत या अंत में IFS वर्णों के किसी भी क्रम को शब्दों को चित्रित करने का कार्य नहीं किया जाता है। यदि आईएफएस में डिफ़ॉल्ट के अलावा एक मूल्य है, तो व्हाट्सएप वर्णों के स्थान और टैब को शब्द के आरंभ और अंत में नजरअंदाज कर दिया जाता है, जब तक कि व्हाट्सएप चरित्र IFS (IFS Iitespace वर्ण) के मान में है। IFS में कोई भी चरित्र जो IFS व्हाट्सएप नहीं है, किसी भी निकटवर्ती IFS व्हाट्सएप वर्ण के साथ, एक क्षेत्र का परिसीमन करता है। IFS व्हॉट्सएप पात्रों का एक अनुक्रम भी एक सीमांकक के रूप में माना जाता है।
इस "सुविधा" को दूर करने के लिए, आप निम्नलिखित की तरह कुछ कर सकते हैं:
#!/bin/bash
DATA1="Andreas Sweden 27"
DATA2="JohnDoe 30" # <---- THERE ARE TWO TABS HERE
echo "$DATA2" | sed 's/\t/;/g' | while IFS=';' read -r NAME COUNTRY AGE; do echo "NAME: $NAME"
echo "COUNTRY: $COUNTRY" echo "AGE: $AGE"
done