बैश में अलग लाइनों पर सरणी तत्वों को प्रिंट करें?


229

मैं अलग लाइन पर बैश ऐरे के ऐरे तत्व को कैसे प्रिंट करूं? यह एक काम करता है, लेकिन निश्चित रूप से एक बेहतर तरीका है:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

इस एक की कोशिश की, लेकिन यह काम नहीं किया:

$ IFS=$'\n' echo ${my_array[*]}
one two three

जवाबों:


436

ऐसा करने का प्रयास करें:

$ printf '%s\n' "${my_array[@]}"

के बीच का अंतर $@और $*:

  • निर्विवाद, परिणाम अनिर्दिष्ट हैं। बैश में, दोनों अलग-अलग आर्गों तक फैलते हैं और फिर वर्डप्लेट और ग्लोबेड होते हैं।

  • उद्धृत, "$@"प्रत्येक तत्व को एक अलग तर्क के रूप में विस्तारित करता है, जबकि "$*" एक तर्क में विलय होने वाले आर्ग्स में फैलता है: "$1c$2c..."(जहां cपहला चार्ट है IFS)।

आप लगभग हमेशा चाहते हैं "$@"। उसी के लिए जाता है "${arr[@]}"

हमेशा उन्हें बोली!


5
और ध्यान दें, यदि आप आंतरिक रिक्त स्थान के साथ तत्वों को अनजाने में विभाजित नहीं करना चाहते हैं, तो चर संदर्भ के आसपास दोहरे उद्धरण महत्वपूर्ण हैं।
डैनफज

4
@sputnick: काम नहीं करता है, सरणी तत्व एक ही लाइन पर समाप्त होते हैं
एक्सल ब्रेग्न्सबो

1
आदेश के बाद दो हाइफ़न क्या हैं? मुझे मैनुअल में इसका कोई संदर्भ नहीं मिला।
जौनपऊ

3
क्या इसे बनाने का कोई तरीका है ताकि यह बिना रिक्त रेखाओं के आउटपुट करे अगर सरणी में कोई तत्व नहीं हैं | grep -v '^$'?
नोएल याप

2
@espaciomore '% s \ n' प्रिंटफ फ़ंक्शन के आउटपुट के लिए प्रारूप है। % s का अर्थ है स्ट्रिंग तर्क के लिए एक प्लेसहोल्डर (इस मामले में सरणी तत्व) और \ n उसके बाद एक लाइन ब्रेक जोड़ता है। इस प्रकार, सरणी में प्रत्येक तत्व के लिए आउटपुट में एक स्ट्रिंग और एक लाइन ब्रेक होगा।
कोजा

71

बस प्रतिध्वनि के तर्क को उद्धृत करें:

( IFS=$'\n'; echo "${my_array[*]}" )

उप शेल उपयोग के बाद IFS को बहाल करने में मदद करता है


3
क्षमा करें, मैंने आपके चेक मार्क को बेहतर बनाया, आपके समाधान को बेहतर पसंद करने के बावजूद, सिर्फ इसलिए कि मैंने 'प्रिंटफ' फ़ंक्शन के बारे में सीखा।
एक्सल ब्रेग्न्सबो

3
इस उत्तर के लिए धन्यवाद - मुझे यह पसंद है! बहुत बुरा काम विस्तार के बाद होता है इसलिए IFS=$'\n' echo "${my_array[*]}"काम नहीं करता है। ओह अच्छा!
cxw

@ cxw, "असाइनमेंट्स होने" से आपका क्या मतलब है?
स्टीवन शॉ

1
@bschlueter, मैंने बैश 4 के साथ कोशिश की - 4.4.23 (1) -release - और यह काम करता है!
स्टीवन शॉ

1
@ cxw आह, मैंने नहीं देखा कि आप वहां क्या करने की कोशिश कर रहे थे। मुझे लगता है कि यह काम नहीं करता है क्योंकि echoबैश में एक बिलिन है। हालांकि, आप इसे एक फ़ंक्शन में लपेट सकते हैं और यह काम करेगा! gist.github.com/steshaw/53ba0095bce8ccab52d26a14375dedb8
स्टीवन शॉ

40

का उपयोग के लिए :

for each in "${alpha[@]}"
do
  echo "$each"
done

इतिहास का उपयोग करना ; ध्यान दें कि यह विफल हो जाएगा यदि आपके मान शामिल हैं !:

history -p "${alpha[@]}"

बेसन का उपयोग करना ; ध्यान दें कि यह विफल हो जाएगा यदि आपके मान शामिल हैं /:

basename -a "${alpha[@]}"

शफ़ का उपयोग करना ; ध्यान दें कि परिणाम क्रम में नहीं आ सकते हैं:

shuf -e "${alpha[@]}"

19
"शुफ़" ... "क्रम में बाहर नहीं आ सकता है" ... प्रफुल्लित करने वाला।
वाल्फ जूल

4
shuf के लिए। किसने सोचा होगा कि उपयोग करें?
फबिकेल

3

मैं यहाँ के लिए एक विशाल में जवाब की कोशिश की ... अगर पाश, लेकिन कोई खुशी नहीं मिली - तो मैंने इसे इस तरह किया, शायद गन्दा लेकिन काम किया:

 # EXP_LIST2 is iterated    
 # imagine a for loop
     EXP_LIST="List item"    
     EXP_LIST2="$EXP_LIST2 \n $EXP_LIST"
 done 
 echo -e $EXP_LIST2

हालांकि इसने सूची में एक स्थान और जोड़ दिया, जो ठीक है - मैं चाहता था कि यह थोड़ा प्रेरित हो। यह भी मान लें कि "\ n" को मूल $ EP_LIST में मुद्रित किया जा सकता है।


5
एक पूर्ण उदाहरण की तरह नहीं दिखता है।
kenorb

3

एक और उपयोगी संस्करण है tr:

echo "${my_array[@]}" | tr ' ' '\n'

यह सरल और कॉम्पैक्ट दिखता है


11
इस विराम को छोड़करmy_array=( "one two" three )
माइक होल्ट

इसे दोहरे उद्धरण चिह्नों के साथ तय किया।
स्टीवन शॉ

बैश संस्करण 4+ पर विज्ञापित के रूप में काम नहीं किया , का उपयोग करना था echo "${my_array[@]}" | tr '' ' \n', हालांकि व्यक्तिगत रूप से मैं echoउस तरह का उपयोग करने से बचूंगा , जहां trमेरी पसंद मुझे लगता है कि tr '' ' \n' <<<"${my_array[@]}"बाद में पढ़ने के लिए थोड़ा आसान हो सकता है।
S0AndS0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.