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

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

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

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


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

答案1

应该使用printf而不是echo:

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

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

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

bash(以及 POSIX shell)中,您经常使用位置参数数组as"$@"而不是"$*",除非您有特殊原因。在支持的 shell 中也是如此常规数组,来自 man bash - 数组部分:

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

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

答案2

你想用它${mtches[*]}来代替。

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

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

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

那么您就不必费心将其设置回来。

答案3

使用为了:

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

使用历史;请注意,如果您的值包含以下内容,这将失败!

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

使用基本名称;请注意,如果您的值包含以下内容,这将失败/

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

使用;请注意,结果可能不会按顺序出现:

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

答案4

for ENTRY in ${ARRAY[@]}; do
    echo $ENTRY
done > outfile

漂亮且可读,并不意味着弄乱 IFS。这也意味着您可以自定义每行的处理。

相关内容