如何在bash中连接数组?

Ena*_*san 26 arrays bash concatenation

我是一个新__CODE__学习者.我有一个数组__CODE__从标准输入中获取输入.我必须连接两次.说,我在数组中有以下元素:

Namibia
Nauru
Nepal
Netherlands
NewZealand
Nicaragua
Niger
Nigeria
NorthKorea
Norway
Run Code Online (Sandbox Code Playgroud)

现在,输出应该是:

Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway
Run Code Online (Sandbox Code Playgroud)

我的代码是:

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[@]}"
Run Code Online (Sandbox Code Playgroud)

请注意,我可以像下面的代码一样打印三次,但这不是我的座右铭.我必须在数组中连接它们.

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

Cha*_*ffy 38

首先,要将列表读入数组,每行一个条目:

readarray -t countries
Run Code Online (Sandbox Code Playgroud)

...或者,对于旧版本的bash:

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

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

countries=( "${countries[@]}" "${countries[@]}" "${countries[@]}" )
Run Code Online (Sandbox Code Playgroud)

...或使用现代语法执行追加:

countries+=( "${countries[@]}" "${countries[@]}" )
Run Code Online (Sandbox Code Playgroud)

  • @jww,使用 `"${countries[*]}"` 将仅添加 *一个* 数组元素,其中包含一个字符串,该字符串与整个国家/地区列表连接在一起,而不是每个国家/地区一个元素。 (2认同)

小智 5

简单地写这个:

countries=$(cat)
countries+=( "${countries[@]}" "${countries[@]}" )
echo ${countries[@]}
Run Code Online (Sandbox Code Playgroud)

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

  • ...也就是说,当你这样做时,你的数组不是 `countries=( ABCABCABC )` 而是 `countries=( "ABC" "ABC" "ABC" )` ;根本看不出这是一个问题,因为使用中的“echo”命令没有被充分引用,因此分割了它的参数。使用 `printf '%q\n' "${countries[@]}"`,每个集合将位于不同的行上,这同样会使问题可见(而如果数组正确填充,每个 *国家*将在不同的线上)。 (3认同)
  • `countries=$(cat)` 将从 stdin 获取的单个字符串分配给数组的第一个元素;各个要素并未分解为各个国家。(使用“declare -p states”显示数组的定义,行为将很明显)。 (2认同)