मैं bash
शेल में एक सरणी के रूप में उपयोगकर्ता इनपुट कैसे पढ़ सकता हूं ?
./array_test.sh < war_and_peace.txt
।
मैं bash
शेल में एक सरणी के रूप में उपयोगकर्ता इनपुट कैसे पढ़ सकता हूं ?
./array_test.sh < war_and_peace.txt
।
जवाबों:
यहाँ यह करने का एक तरीका है:
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
यदि आप इसे चलाते हैं, तो यह मानक-इनपुट से तब तक पढ़ता रहेगा जब तक आप Ctrl + D (EOF) को नहीं मारते। बाद में, आपके द्वारा दर्ज की गई लाइनें अंदर होंगी my_array
। कुछ को यह कोड भ्रामक लग सकता है। लूप का शरीर मूल रूप से कहता है my_array = my_array + element
।
प्रलेखन के कुछ दिलचस्प टुकड़े:
उन्नत बैश-पटकथा गाइड एक महान है सरणियों पर अध्याय
की मैनपेज पढ़ने builtin
15 सरणी उदाहरण thegeekstuff.com से
read -r
कभी-कभी काफी उपयोगी / महत्वपूर्ण होता है ... स्टेफ़ानो का लिंक "रीड बिलिन मैनपेज" के लिए इसका उद्देश्य बताता है ... (बैकस्लैश व्याख्या को रोकने के लिए)।
और जो हर बार सरणी को फिर से नहीं बनाता है (हालाँकि इसके लिए 3.1 या नए की आवश्यकता होती है):
array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
[[ $line ]] || break # break if line is empty
array+=("$line")
done
printf '%s\n' "Items read:"
printf ' «%s»\n' "${array[@]}"
अधिक के लिए http://mywiki.wooledge.org/BashFAQ/001 देखें ।
और हमेशा की तरह, लिखने के कीड़े से बचने के लिए http://mywiki.wooledge.org/BashGuide पढ़ें और एडवांस बैश स्क्रिप्टिंग गाइड की तरह टल्डप-गाइड से बचें।
IFS
मुद्दे को इंगित करने के लिए धन्यवाद । इसे बिना खींचे, 'पढ़ें' सभी प्रमुख और अनुगामी व्हाट्सएप को छीन लेता है ... और निश्चित रूप से -r
भी ...
कैसे इस एक लाइनर के बारे में;)
arr=( $(cat -) )
echo ${arr[@]}
संपादित करें:
में bash
,
arr=(val1 val2 ...)
किसी सरणी में असाइन करने का तरीका है । कमांड प्रतिस्थापन के साथ संयोजन में इसका उपयोग करते हुए, आप पाइपलाइन से सरणियों में पढ़ सकते हैं जो कि read
सीधे-सीधे तरीके से इसे पूरा करने के लिए उपयोग करना संभव नहीं है :
echo -e "a\nb" | read -a arr
echo ${arr[@]}
आप पाएंगे कि यह इस तथ्य के कारण कुछ भी उत्पादन नहीं read
करता है कि stdin
पाइप के बाद से कुछ भी नहीं होता है क्योंकि पाइप लाइन को एक उपधारा में चलाया जा सकता है ताकि चर बिल्कुल भी उपयोग करने योग्य न हो।
इस उत्तर द्वारा सुझाए गए तरीके का उपयोग करना:
arr=(`echo -e "a\nb"`)
echo ${arr[@]}
यह देता है a b
जो रास्ता सरल है और एक पाइप से एक शेल चर में पढ़ें मूल्यों के जवाब द्वारा दिए गए किसी भी समाधान से अधिक सीधे आगे है और एक पाइप के बाद पढ़ा bash में मान सेट नहीं है ।
cat war_and_peace.txt | ./array_test.sh
।