How do I convert a bash array variable to a string delimited with newlines?
Solution 1
Here's a way that utilizes bash parameter expansion and its IFS
special variable.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
We use a subshell to avoid overwriting the value of IFS
in the current environment. In that subshell, we then modify the value of IFS
so that the first character is a newline (using $'...'
quoting). Finally, we use parameter expansion to print the contents of the array as a single word; each element is separated by the first charater of IFS
.
To capture to a variable:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
If your bash is new enough (4.2 or later), you can (and should) still use printf
with the -v
option:
$ printf -v var "%s\n" "${System[@]}"
In either case, you may not want the final newline in var
. To remove it:
$ var=${var%?} # Remove the final character of var
Solution 2
You can use printf
to print each array item on its own line:
$ System=('s1' 's2' 's3' 's4 4 4')
$ printf "%s\n" "${System[@]}"
s1
s2
s3
s4 4 4
Solution 3
awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"
or
perl -le 'print join "\n",@ARGV' "${arr[@]}"
or
python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"
or
sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"
or
lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"
or
tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"
or
php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"
or
ruby -e 'puts ARGV.join("\n")' "${arr[@]}"
that's all I can remind so far.
Solution 4
Above solutions are pretty much it, but the original question asks for output to file:
$ a=(a b c d e)
$ ( IFS=$'\n'; echo "${a[*]}" ) > /tmp/file
$ cat /tmp/file
a
b
c
d
e
$
Notes: 1) 'echo' provides the final newline 2) If this file will just be read in by bash again, then declare -p may be the serialization wanted.
Solution 5
Using for:
for each in "${alpha[@]}"
do
echo "$each"
done
Using history; note this will fail if your values contain !
:
history -p "${alpha[@]}"
Using basename; note this will fail if your values contain /
:
basename -a "${alpha[@]}"
Using shuf; note that results might not come out in order:
shuf -e "${alpha[@]}"
Related videos on Youtube
ACyclic
Updated on September 18, 2022Comments
-
ACyclic almost 2 years
I want to write out a bash array variable to a file, with each element on a new line. I could do this with a for loop, but is there another (cleaner) way to join the elements with
\n
? -
chepner almost 12 yearsUpdated to show how to capture to a variable.
-
musiphil almost 11 yearsShouldn't the last example be
var=${var%?}
instead? This is not a regular expression, so.
will match only a period character. -
codeforester over 6 yearsDownvoter, please comment what is wrong here.
-
Seff about 5 yearsNeed quotes the array variable name:
$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
-
dave_thompson_085 about 4 years
var=$( .. )
trims the trailing newline automatically;printf -v var
doesn't