it-swarm.com.de

wie verkettet man Arrays in Bash?

Ich bin eine neue bash Lernende. Ich habe ein Array in bash, das Eingaben von der Standardeingabe entnimmt. Ich muss mich zweimal verketten. Sagen wir, ich habe die folgenden Elemente im Array:

Namibia
Nauru
Nepal
Netherlands
NewZealand
Nicaragua
Niger
Nigeria
NorthKorea
Norway

Nun sollte die Ausgabe sein:

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

Mein Code lautet:

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

Beachten Sie, dass ich es dreimal wie den unten stehenden Code drucken kann, aber es ist nicht mein Motto. Ich muss sie im Array verketten.

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

Um Ihre Liste in ein Array einzulesen, einen Eintrag pro Zeile:

readarray -t countries

... oder mit älteren bash-Versionen:

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

Zweitens, um die Einträge zu duplizieren, erweitern Sie entweder das Array dreimal auf sich selbst:

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

... oder verwenden Sie die moderne Syntax zum Anhängen:

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

Schreiben Sie einfach folgendes:

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

Die erste Zeile dient dazu, das Eingabearray zu übernehmen, die zweite zu verketten und die letzte zum Drucken des Arrays.

1
Amit24x7

in Ubuntu 14.04 würden die folgenden drei Elemente verkettet (eine Elementanzahl würde 3 ergeben), wobei jedes Element ein Array countries ist:

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

während das unten alle Elemente in einem einzigen Array verketten würde:

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

davon würden 30 gezählt (unter Berücksichtigung der in der ursprünglichen Post angegebenen Länder).

0
Jerome