web-dev-qa-db-ja.com

bashで配列を連結する方法は?

私はBashの初心者です。標準入力から入力を取得する配列があります。 2回連結する必要があります。たとえば、配列には次の要素があります。

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

以下のコードのように3回印刷できますが、それは私のモットーではありません。それらを配列に連結する必要があります。

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

最初に、リストを配列に読み込むには、1行に1エントリ:

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

次に、エントリを複製するには、配列を3回それ自体に展開します。

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

...または最新の構文を使用して追加を実行します。

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

これを書くだけです:

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

1行目は入力配列、2行目は連結、最後は配列を出力します。

3
Amit24x7

ubuntu 14.04では、以下は3つの要素を連結します(要素数は3になります)。各要素は配列countriesです:

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

以下は、1つの配列内のすべての要素を連結します。

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

この数は30になります(元の投稿で指定された国を考慮に入れます)。

0
Jerome