![如何将 bash 数组变量转换为以换行符分隔的字符串?](https://linux22.com/image/1325900/%E5%A6%82%E4%BD%95%E5%B0%86%20bash%20%E6%95%B0%E7%BB%84%E5%8F%98%E9%87%8F%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BB%A5%E6%8D%A2%E8%A1%8C%E7%AC%A6%E5%88%86%E9%9A%94%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
我想将一个 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[@]}"