मैं बैश में एक सरणी के रूप में उपयोगकर्ता इनपुट कैसे पढ़ सकता हूं?


15

मैं bashशेल में एक सरणी के रूप में उपयोगकर्ता इनपुट कैसे पढ़ सकता हूं ?


मैं मान रहा हूँ कि आप स्टड से पढ़ना चाहते हैं? मेरा उत्तर भी निष्पादन की तरह काम करेगा cat war_and_peace.txt | ./array_test.sh
Stefano Palazzo

या बस ./array_test.sh < war_and_peace.txt
एलियाह कगन

जवाबों:


14

यहाँ यह करने का एक तरीका है:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

यदि आप इसे चलाते हैं, तो यह मानक-इनपुट से तब तक पढ़ता रहेगा जब तक आप Ctrl + D (EOF) को नहीं मारते। बाद में, आपके द्वारा दर्ज की गई लाइनें अंदर होंगी my_array। कुछ को यह कोड भ्रामक लग सकता है। लूप का शरीर मूल रूप से कहता है my_array = my_array + element

प्रलेखन के कुछ दिलचस्प टुकड़े:


3
read -rकभी-कभी काफी उपयोगी / महत्वपूर्ण होता है ... स्टेफ़ानो का लिंक "रीड बिलिन मैनपेज" के लिए इसका उद्देश्य बताता है ... (बैकस्लैश व्याख्या को रोकने के लिए)।
पीटर

10

इसे इस्तेमाल करके पढ़ें:

read -a arr

और मुद्रण के लिए, उपयोग करें:

for elem in ${arr[@]}
do 
  echo $elem
done

4

और जो हर बार सरणी को फिर से नहीं बनाता है (हालाँकि इसके लिए 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भी ...
पीटर

0

कैसे इस एक लाइनर के बारे में;)

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 में मान सेट नहीं है


क्या आपने इसका परीक्षण किया?
cmak.fr

@ cmak.fr हाँ यह मेरे लिए काम करता है
क्वार्क

@ मेलेबियस मैंने इसकी व्याख्या की है और इस वन-लाइनर का लाभ उठाया है।
जियाहो जू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.