我正在尝试构建一个bash数组来容纳一系列链接。我使用AWK从links.csv文件[分别为第2列和第4列]中获取名称和href属性。 CSV文件包含13个链接的信息。
arrayLinks=($(awk -F, 'NR>2 {printf("\"<a name=%s href=%s target=_blank>\" \n", $2, $4)}' $linksPath))
如果仅在控制台中运行AWK部件,则会得到以下信息:
"<a name=name1 href=href1 target=_blank>"
"<a name=name2 href=href2 target=_blank>"
"<a name=name3 href=href3 target=_blank>"
"<a name=name4 href=href4 target=_blank>"
这正是我想要的。但是,如果我在bash脚本中运行代码,而不是得到包含13个元素的数组,而是得到一个包含更多元素的数组[看来空格充当元素定界符]。
echo "Number of items in original array: ${#arrayLinks[*]}"
我只得到13个结果,却得到52个结果!我该怎么办?
谢谢!
答案 0 :(得分:0)
鉴于输出中似乎不太可能出现换行符,您应该使用readarray
而不是依靠分词。
readarray -t arrayLinks < <(
awk -F, 'NR > 2
{
printf("\"<a name=%s href=%s target=_blank>\" \n", $2, $4)
}
' "$linksPath"
)
(换行符仅供参考;您可以根据需要将其折叠为一行。)
问题是,当扩展命令替换时,输出中的每个空格用于将结果拆分为单词。引号只是输出的一部分,而不是保护空格的语法引号。
另一方面,readarray
命令为数组的每个元素仅使用一行输入(不分词)。 (如果您使用的是bash
4.4或更高版本,则可以让awk
编写以空分隔的输出,并使用-d
告诉readarray
如何将其输入拆分为数组元素。)