बैश में एक नई पंक्ति में सरणी के प्रत्येक तत्व के साथ एक फ़ाइल के लिए एक सरणी मुद्रण


13

मैं फ़ाइल में एक नई पंक्ति में सरणी के प्रत्येक तत्व के साथ फ़ाइल में एक सरणी की सामग्री की कोशिश कर रहा हूं।

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 


Mtches की सामग्री "qwe" और "asd" है। लेकिन sample1.txtफाइल qwe asdमें एक ही लाइन है। यह तस्वीर में आईएफएस मान क्यों नहीं ले रहा है?

जवाबों:


17

आपको इसके बजाय उपयोग करना चाहिएprintfecho :

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

यदि mtchesखाली है जो अभी भी एक खाली लाइन का उत्पादन करेगा। उस के लिए खाते में:

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file

में bash(और यह भी POSIX गोले), जिनका उपयोग आप अक्सर स्थितीय पैरामीटर सरणी के रूप में "$@"करने के बजाय "$*", जब तक आप एक विशेष कारण है। यह भी गोले में सच है जो नियमित रूप से सरणियों का समर्थन करता है , आदमी बैश से - अनुभाग अरे :

किसी सरणी के किसी भी तत्व को $ {name [सबस्क्रिप्ट]} का उपयोग करके संदर्भित किया जा सकता है। ब्रेस को शेल के फाइलनाम विस्तार ऑपरेटरों के साथ संघर्ष से बचने के लिए आवश्यक है। यदि सबस्क्रिप्ट '@' या '*' है, तो शब्द ऐरे नाम के सभी सदस्यों तक फैलता है। ये सदस्यता केवल तभी भिन्न होती है जब शब्द दोहरे उद्धरण चिह्नों में प्रकट होता है। यदि यह शब्द दोहरा-उद्धृत है, तो $ {name [*]} IFS चर के पहले वर्ण द्वारा अलग किए गए प्रत्येक सरणी सदस्य के मान के साथ एक शब्द तक फैलता है, और $ {name [@]} नाम के प्रत्येक तत्व का विस्तार करता है एक अलग शब्द के लिए। जब कोई सरणी सदस्य नहीं होते हैं, तो $ {name [@]} कुछ भी नहीं फैलता है। यदि किसी शब्द के भीतर डबल-कोटेड विस्तार होता है, तो पहले पैरामीटर का विस्तार मूल शब्द के शुरुआती भाग के साथ जुड़ जाता है, और अंतिम पैरामीटर का विस्तार मूल शब्द के अंतिम भाग के साथ जुड़ जाता है।

"${array[*]}"जब आप सभी ऐरे तत्वों को एक स्ट्रिंग में शामिल करना चाहते हैं तब ही उपयोग करें ।


यह कैसे एक अलग बनाता है?
अश्विन


7

आप ${mtches[*]}इसके बजाय उपयोग करना चाहते हैं ।

जब आप उपयोग करते हैं "${mtches[@]}", तो इससे कोई फर्क नहीं पड़ता कि मूल्य क्या $IFSहै, बैश सरणी को कई तर्कों में विभाजित करेगा। आप जो चाहते हैं, वह प्रत्येक एरे तत्व के साथ एक एकल तर्क है जो इसमें शामिल हो गया है \n${mtches[*]}इसे पूरा करता है।

सेटिंग के अस्थायी तरीके के रूप में $IFS, आप यह कर सकते हैं:

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

फिर आपको इसे वापस सेट करने की जरूरत नहीं है।


pubs.opengroup.org/onlinepubs/9699919799/utilities/… <- POSIX संदर्भ (यह केवल बैश पर लागू नहीं होता है)।
Mat

या उपयोग करें printf...
jasonwryan

2

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

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

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

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

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

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

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

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

1
for ENTRY in ${ARRAY[@]}; do
    echo $ENTRY
done > outfile

अच्छा और पठनीय और IFS के साथ खिलवाड़ का मतलब नहीं है। इसका मतलब यह भी है कि आप प्रत्येक लाइन की हैंडलिंग को कस्टमाइज़ कर सकते हैं।


1
लेकिन गलत है जैसा कि आप उपयोग कर रहे हैं echoजिसका उपयोग मनमानी सामग्री के लिए नहीं किया जा सकता है और अपने चर को उद्धृत करना भूल गया है । थोड़ा बेहतर संस्करण पहले से ही स्टीवनपनी द्वारा पोस्ट किया गया था
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.