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

Ash*_*win 15 bash

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

IFS=$'\n'   
echo "${mtches[@]}" > sample1.txt 
Run Code Online (Sandbox Code Playgroud)


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

cuo*_*glm 20

您应该使用printf代替echo:

printf "%s\n" "${mtches[@]}"
Run Code Online (Sandbox Code Playgroud)

如果mtches为空,仍然会输出一个空行。考虑到这一点:

{ [ "${#mtches[@]}" -eq 0 ] || printf '%s\n' "${mtches[@]}"; } > file
Run Code Online (Sandbox Code Playgroud)

在bash(也POSIX壳),你经常使用的位置参数数组作为"$@"替代"$*",除非你有特殊的原因。在支持常规数组的shell 中也是如此,来自 man bash - section Arrays:

可以使用 ${name[subscript]} 引用数组的任何元素。需要大括号以避免与 shell 的文件名扩展运算符发生冲突。如果下标为“@”或“*”,则该词将扩展为数组名称的所有成员。这些下标仅在单词出现在双引号内时才不同。如果单词是双引号,则 ${name[*]} 扩展为单个单词,每个数组成员的值由 IFS 变量的第一个字符分隔,${name[@]} 扩展 name 的每个元素到一个单独的词。当没有数组成员时, ${name[@]} 扩展为空。如果双引号扩展发生在一个词内,则第一个参数的扩展与原词的开头部分连接,最后一个参数的扩展与原词的最后部分连接。

仅"${array[*]}"当您想将所有数组元素连接到一个字符串时使用。


phe*_*mer 7

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

当您使用 时"${mtches[@]}",无论值$IFS是什么,bash 都会将数组拆分为多个参数。您想要的是每个数组元素由\n. ${mtches[*]}实现这一点。

同样作为设置的临时方式$IFS,您可以执行以下操作:

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

然后你就不必费心把它设置回来。