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
?
Answer
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
No comments:
Post a Comment