我正在尝试将数组的内容放入文件中,并将数组的每个元素放在文件的新行中。
IFS=$'\n'
echo "${mtches[@]}" > sample1.txt
mtches的内容是“qwe”和“asd”。但该sample1.txt
文件包含qwe asd
在一行中。为什么它不考虑 IFS 价值?
答案1
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。这也意味着您可以自定义每行的处理。