Arrays 如何在bash中连接数组?

Arrays 如何在bash中连接数组?,arrays,bash,concatenation,Arrays,Bash,Concatenation,我是一个新手。我有一个从标准输入获取输入的数组。我必须连接它自己两次。比如说,数组中有以下元素: Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway 现在,输出应该是: Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway Namibia Nauru Nepal

我是一个新手。我有一个从标准输入获取输入的数组。我必须连接它自己两次。比如说,数组中有以下元素:

Namibia
Nauru
Nepal
Netherlands
NewZealand
Nicaragua
Niger
Nigeria
NorthKorea
Norway
现在,输出应该是:

Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway
我的代码是:

countries=()
while read -r country; do
    countries+=( "$country" )
done
countries=countries+countries+countries # this is the wrong way, i want to know the right way to do it
echo "${countries[@]}"
请注意,我可以像下面的代码一样打印三次,但这不是我的座右铭。我必须在数组中连接它们

countries=()
while read -r country; do
    countries+=( "$country" )
done
echo "${countries[@]} ${countries[@]} ${countries[@]}"

首先,要将列表读入数组,请每行输入一项:

readarray -t countries
…或者,对于较旧版本的bash:

# same, but compatible with bash 3.x; || is to avoid non-zero exit status.
IFS=$'\n' read -r -d '' countries || (( ${#countries[@]} ))

其次,要复制条目,请将数组自身展开三次:

countries=( "${countries[@]}" "${countries[@]}" "${countries[@]}" )
…或使用现代语法执行追加:

countries+=( "${countries[@]}" "${countries[@]}" )
简单地写下:

countries=$(cat)
countries+=( "${countries[@]}" "${countries[@]}" )
echo ${countries[@]}

第一行是获取输入数组,第二行是连接,最后一行是打印数组。

在Ubuntu14.04上,下面将连接三个元素(元素计数将给出:3),每个元素都是一个数组

countries=()
while read -r country; do
    countries+=( "$country" )
done
echo "${countries[@]} ${countries[@]} ${countries[@]}"
countries=( "${countries[@]}" "${countries[@]}" "${countries[@]}" )
下面的命令将把所有元素连接在一个数组中:

countries=( ${countries[*]} ${countries[*]} ${countries[*]} )

这个数字是30(考虑到原始帖子中指定的国家)。

您在自己的代码中附加了数组…@hustmphrr,将单个项目附加到数组中(通过附加单个值数组),是的,但我可以想象有人不明白他们已经使用的语法是什么。但我不知道,如何添加自身。谢谢@hustmphrr
countries=$(cat)
将从stdin获取的单个字符串分配给数组的第一个元素;个别因素并没有分解成个别国家。(使用
declare-p countries
显示数组的定义,行为将是显而易见的)…也就是说,当您这样做时,您的数组不是
countries=(A B C A B C A B C C C)
而是
countries=(“A B C”“A B C”“A B C”)
;很明显,这是一个问题,因为所使用的
echo
命令引用不充分,因此分割了它的参数。使用
printf'%q\n'${countries[@]}“
,每个集合将位于不同的行上,这同样会使问题可见(如果数组填充正确,每个国家将位于不同的行上)。在上一个示例中连接数组时,为什么不使用
“${countries[*]}”
(而不是
)${countries[@]}“
打印时喜欢吗?”@jww使用
“${countries[*]}”
将只添加一个数组元素,该数组元素包含一个字符串,并且将整个国家列表连接在一起,而不是每个国家一个元素。@jww,…。相反,
${countries[*]}
如果没有引号,将更改名称中带有空格的国家--
新几内亚
,例如--将每个单词分隔成自己的列表元素(为
几内亚
中的每一个添加单独的数组元素)。这是错误的。
国家=(“${countries[@]}”“${countries[@]}”“${countries[@]}”)
将原始数组扩展三次,每个原始数组元素在这三次中分别创建一个元素。
国家=(${countries[*]}${countries[*]}${countries[*]})
相反,字符串拆分和glob扩展原始数组。假设您有
国家=(“新几内亚”“新西兰”“朝鲜”)
result=(“${countries[@]}”“${countries[@]}”“${countries[@]}”)
扩展到九项。相比之下,
result=(${countries[*]}${countries[*]}${countries[*]})扩展到十八项,因为每个
新的
都成为自己的数组元素。(如果它拆分成的任何一个单词是一个可以匹配本地磁盘上文件的glob,那就更复杂了!)…请查看以下代码在联机解释器中运行,其输出如下: