web-dev-qa-db-ja.com

Bashの可変リストまたは配列構造?どうすれば簡単に追加できますか?

Bashスクリプトで文字列値を収集しようとしています。リストまたは配列構造に文字列値を追加して、それらを最後にエコーアウトできる最も簡単な方法は何ですか?

57
Joe
$ arr=(1 2 3)
$ arr+=(4)
$ echo ${arr[@]}
1 2 3 4

Bashはスパース配列を使用するため、要素カウント${#arr}をインデックスとして使用しないでください。ただし、次のようなインデックスの配列を取得できます。

$ indices=(${!arr[@]})
97
foo=(a b c)
foo=("${foo[@]}" d)
for i in "${foo[@]}"; do echo "$i" ; done

イグナシオが別の回答で提案したことを追加するには:

foo=(a b c)
foo=("${foo[@]}" d) # Push element 'd'

foo[${#foo[*]}]="e" # Push element 'e'

for i in "${foo[@]}"; do echo "$i" ; done
3
codaddict
$ for i in "string1" "string2" "string3"
> do
> array+=($i)
> done
$ echo ${array[@]}
string1 string2 string3
2
ghostdog74

Bashの配列の最後に追加するためのかなりあいまいな構文は次のとおりです。

myarr[${#myarr[*]}]=”$newitem”
2
ennuikiller

質問は答えられており、かなり古いですが、 ennukiller の答え(私の100k行のテストではそれが勝った14秒に対して12秒ですが、リスト追加ソリューションには数分かかります)。

次のトリックを使用できます。

# WORKS FASTER THAN THESE LAME LISTS! ! !
size=0;while IFS= read -r line; do
    echo $line
    ((++size))
    eval "SWAMP_$size='$line'"
done

または、次のことを実行できます。

#!/bin/bash
size=0
namespace="SWAMP"

ArrayAppend() {
    namespace="$1"
    # suppose array size is global
    new_value="$2"
    eval "${namespace}_$size='$2'"
    eval "echo \$${namespace}_$size"
    ((++size))
}

ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"
ArrayAppend "$namespace" "$RANDOM"

インタプリタがタグリストにある限り、ここに オブジェクト指向bash のリンクがあります。

0
theoden