जवाबों:
यहां एक तरीका है जो बैश पैरामीटर विस्तार और इसके IFS
विशेष चर का उपयोग करता है ।
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
हम IFS
वर्तमान वातावरण में मूल्य को अधिलेखित करने से बचने के लिए एक उपधारा का उपयोग करते हैं। उस उपधारा में, हम तब मूल्य को संशोधित करते हैं IFS
ताकि पहला वर्ण एक नई पंक्ति ( $'...'
उद्धरण का उपयोग करके ) हो। अंत में, हम एक शब्द के रूप में सरणी की सामग्री को प्रिंट करने के लिए पैरामीटर विस्तार का उपयोग करते हैं; प्रत्येक तत्व पहले चारित्र द्वारा अलग किया जाता है IFS
।
एक चर पर कब्जा करने के लिए:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
यदि आपका बैश काफी नया है (4.2 या बाद में), तो आप विकल्प के printf
साथ अभी भी उपयोग कर सकते हैं (और चाहिए) -v
:
$ printf -v var "%s\n" "${System[@]}"
किसी भी स्थिति में, आप अंतिम नई पंक्ति नहीं चाह सकते हैं var
। इसे हटाने के लिए:
$ var=${var%?} # Remove the final character of var
var=${var%?}
इसके बजाय अंतिम उदाहरण नहीं होना चाहिए ? यह एक नियमित अभिव्यक्ति नहीं है, इसलिए .
केवल एक अवधि चरित्र से मेल खाएगा।
$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"
या
perl -le 'print join "\n",@ARGV' "${arr[@]}"
या
python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"
या
sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"
या
lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"
या
tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"
या
php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"
या
ruby -e 'puts ARGV.join("\n")' "${arr[@]}"
यह सब मैं अब तक याद दिला सकता हूं।
उपरोक्त समाधान बहुत अधिक हैं, लेकिन मूल प्रश्न फ़ाइल में आउटपुट के लिए पूछता है:
$ a=(a b c d e)
$ ( IFS=$'\n'; echo "${a[*]}" ) > /tmp/file
$ cat /tmp/file
a
b
c
d
e
$
नोट: 1) 'इको' अंतिम न्यूलाइन 2 प्रदान करता है) यदि यह फाइल बस बैश द्वारा फिर से पढ़ी जाएगी, तो घोषणा -p क्रमबद्धता चाहता था हो सकता है।
का उपयोग के लिए :
for each in "${alpha[@]}"
do
echo "$each"
done
इतिहास का उपयोग करना ; ध्यान दें कि यह विफल हो जाएगा यदि आपके मान शामिल हैं !
:
history -p "${alpha[@]}"
बेसन का उपयोग करना ; ध्यान दें कि यह विफल हो जाएगा यदि आपके मान शामिल हैं /
:
basename -a "${alpha[@]}"
शूफ का उपयोग करना ; ध्यान दें कि परिणाम क्रम में नहीं आ सकते हैं:
shuf -e "${alpha[@]}"
मेरी , केवल बग बैश का उपयोग करते हुए, बिना उत्परिवर्तन के IFS
:
# $1 separator
# $2… strings
join_strings () {
declare separator="$1";
declare -a args=("${@:2}");
declare result;
printf -v result '%s' "${args[@]/#/$separator}";
printf '%s' "${result:${#separator}}"
}
$ join_strings $'\n' "a b c" "d e f" "g h i"
a b c
d e f
g h i
आप किसी भी विभाजक का उपयोग कर सकते हैं:
$ join_strings '===' "a b c" "d e f" "g h i"
a b c===d e f===g h i
printf
एक सरणी से एक सीमांकित स्ट्रिंग बनाने के लिए सबसे कुशल दृष्टिकोण प्रतीत होता है:
# create a delimited string; note that printf doesn't put the trailing delimiter
# need to save and restore IFS
# it is prudent to put the whole logic on a single line so as to minimize the risk of future code changes breaking the sequence of saving/restoring of IFS
oldIFS=$IFS; IFS=$'\n'; printf -v var "${arr[*]}"; IFS=$oldIFS
# print string to file; note that the newline is required in the format string because printf wouldn't put a trailing delimiter (which is a good thing)
printf '%s\n' "$var" > file
ऐसा करने का एक सरल तरीका यह भी है:
delim=$'\n'
printf -v var "%s$delim" "${arr[@]}" # create a delimited string
var="${var%$delim}" # remove the trailing delimiter
delim=:
arr=(one two three)
printf -v var "%s$delim" "${arr[@]}" # yields one:two:three:
var="${var%$delim}" # yields one:two_three