如何将 bash 数组变量转换为以换行符分隔的字符串?

如何将 bash 数组变量转换为以换行符分隔的字符串?

我想将一个 bash 数组变量写入一个文件,每个元素占一行。我可以使用 for 循环来实现这一点,但是有没有其他(更简洁)的方法来连接元素\n

答案1

这是一种利用 bash 参数扩展及其IFS特殊变量的方法。

$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )

IFS我们使用子 shell 来避免在当前环境中覆盖 的值。在该子 shell 中,我们修改 的值IFS,使第一个字符为换行符(使用$'...'引号)。最后,我们使用参数扩展将数组的内容打印为单个单词;每个元素由 的第一个字符分隔IFS

捕获到变量:

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

如果你的 bash 足够新(4.2 或更高版本),你仍然可以(并且应该)使用printf以下-v选项:

$ printf -v var "%s\n" "${System[@]}"

无论哪种情况,您可能都不需要 中的最后一个换行符var。要删除它:

$ var=${var%?}    # Remove the final character of var

答案2

您可以使用printf它将每个数组项打印在其自己的行上:

 $ System=('s1' 's2' 's3' 's4 4 4')
 $ printf "%s\n"  "${System[@]}"
s1
s2
s3
s4 4 4

答案3

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[@]}"

到目前为止我能提醒的就是这些。

答案4

使用为了

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

使用历史;请注意,如果您的值包含以下内容,此操作将会失败!

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

使用基名;请注意,如果您的值包含以下内容,此操作将会失败/

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

使用舒夫;请注意,结果可能不会按顺序出现:

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

相关内容