web-dev-qa-db-fra.com

comment concaténer des tableaux dans bash?

Je suis un nouvel apprenti bash. J'ai un tableau dans bash prenant l'entrée de l'entrée standard. Je dois me concaténer deux fois. Dis, j'ai les éléments suivants dans le tableau:

Namibia
Nauru
Nepal
Netherlands
NewZealand
Nicaragua
Niger
Nigeria
NorthKorea
Norway

Maintenant, le résultat devrait être:

Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway Namibia Nauru Nepal Netherlands NewZealand Nicaragua Niger Nigeria NorthKorea Norway

Mon code est:

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[@]}"

Notez que je peux l’imprimer trois fois comme le code ci-dessous, mais ce n’est pas ma devise. Je dois les concaténer dans le tableau.

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

Tout d’abord, pour lire votre liste dans un tableau, une entrée par ligne:

readarray -t countries

... ou, avec les anciennes versions de bash:

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

Deuxièmement, pour dupliquer les entrées, développez le tableau trois fois:

countries=( "${countries[@]}" "${countries[@]}" "${countries[@]}" )

... ou utilisez la syntaxe moderne pour effectuer un ajout:

countries+=( "${countries[@]}" "${countries[@]}" )
28
Charles Duffy

Écrivez simplement ceci:

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

La première ligne consiste à prendre un tableau en entrée, la seconde à concaténer et la dernière à l’imprimer.

1
Amit24x7

sur Ubuntu 14.04, les éléments suivants concaténeraient trois éléments (un nombre d’éléments donnerait: 3), chaque élément étant un tableau countries:

countries=( "${countries[@]}" "${countries[@]}" "${countries[@]}" )

alors que ci-dessous concaténerait tous les éléments dans un seul tableau:

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

le nombre serait de 30 (compte tenu des pays spécifiés dans le message d'origine).

0
Jerome