在bash中以新行将数组的每个元素打印到文件中


13

我正在尝试将数组的内容放入文件中,并将数组的每个元素放在文件的新行中。

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 


mtches的内容是“ qwe”和“ asd”。但是sample1.txt文件包含qwe asd在一行中。为什么不将IFS的价值纳入考虑?

Answers:


17

应该使用printf而不是echo

printf "%s\n" "${mtches[@]}"

如果mtches为空,则仍将输出一条空行。要说明这一点:

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file

bash(以及POSIX shell)中,除非有特殊原因,否则通常将Positional Parameters数组用作"$@"而不是"$*"。在支持常规数组的 shell中也是如此,来自man bash-Arrays部分

数组的任何元素都可以使用$ {name [subscript]}进行引用。需要使用花括号来避免与Shell的文件名扩展运算符冲突。如果下标为'@'或'*',则单词将扩展为数组名称的所有成员。仅当单词出现在双引号中时,这些下标才不同。如果单词用双引号引起来,则$ {name [*]}扩展为一个单词,每个数组成员的值均由IFS变量的第一个字符分隔,而$ {name [@]}扩展每个name元素换一个词。如果没有数组成员,则$ {name [@]}会扩展为空。如果双引号扩展出现在单词内,则第一个参数的扩展与原始单词的开头部分合并,而最后一个参数的扩展与原始单词的末尾部分连接。

"${array[*]}"在要将所有数组元素连接到字符串时使用。


这有何不同?
Ashwin


7

您想${mtches[*]}改用。

当使用时"${mtches[@]}",的值无关紧要$IFS,bash会将数组拆分为多个参数。您想要的是一个单个参数,每个数组元素都由组成\n${mtches[*]}完成此任务。

另外,作为一种临时设置方式$IFS,您可以执行以下操作:

( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )

然后,您不必费心将其重新设置。



或使用printf...
jasonwryan 2014年

2

使用

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

利用历史 ; 请注意,如果您的值包含!

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

使用basename ; 请注意,如果您的值包含/

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

使用shuf ; 请注意,结果可能不会按顺序显示:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.