我正在尝试将数组的内容放入一个文件中,并将数组的每个元素放在文件的新行中。
IFS=$'\n'
echo "${mtches[@]}" > sample1.txt
Run Code Online (Sandbox Code Playgroud)
mtches 的内容是“qwe”和“asd”。但该sample1.txt文件包含qwe asd在一行中。为什么不考虑 IFS 值?
cuo*_*glm 20
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[*]}"当您想将所有数组元素连接到一个字符串时使用。
你想${mtches[*]}改用。
当您使用 时"${mtches[@]}",无论值$IFS是什么,bash 都会将数组拆分为多个参数。您想要的是每个数组元素由\n. ${mtches[*]}实现这一点。
同样作为设置的临时方式$IFS,您可以执行以下操作:
( IFS=$'\n'; echo "${mtches[*]}" > sample1.txt )
Run Code Online (Sandbox Code Playgroud)
然后你就不必费心把它设置回来。