Answers:
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[*]}"在要将所有数组元素连接到字符串时使用。
您想${mtches[*]}改用。
当使用时"${mtches[@]}",的值无关紧要$IFS,bash会将数组拆分为多个参数。您想要的是一个单个参数,每个数组元素都由组成\n。${mtches[*]}完成此任务。
另外,作为一种临时设置方式$IFS,您可以执行以下操作:
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
然后,您不必费心将其重新设置。
printf...
for ENTRY in ${ARRAY[@]}; do
echo $ENTRY
done > outfile
美观,易读,并不意味着要弄乱IFS。这也意味着您可以自定义每行的处理。
echo不能用于任意内容,忘记引用变量。StevenPenny