10

まず、これはこのフォーラムでの最初の質問であり、フォーマットがいたるところにある場合はお詫び申し上げます。第二に、私はそれほど多くの bash スクリプトを書いたことがなく、作成するスクリプトの間隔がかなり長くなる傾向があります。

とはいえ、ここで私の質問です。

bash で次のようなことを行うことは可能ですか (Clear array $array contains):
$array=()

基本的にこれは私がやりたいことです。配列変数名を含む変数があります。

array1=()  
array2=()  
arrayList="array1 array2"  


# In a function far far away
for array in $arrayList
do  
    eval arr=("\"\${$array[@]\"")  

    for index in ${!arr[@]}
    do
        echo "${arr[$index]}"
    done
    # Here is the big "?", I like to clear the array that $array refers to.
    $array=()  
done

私の配列には " " (スペース) を含む文字列が含まれているため、evalステートメントを使用します。必要かどうかはわかりませんが、少なくとも機能しています。スクリプトは多かれ少なかれ私が望むように機能していますが、 の配列をクリアする必要があり、$arrayListどこかにハードコードするのは簡単ではありません。

4

3 に答える 3

12

おそらく最も簡単なことは、それらだけunsetです。設定されていない変数は、ほとんどのコンテキストで空の配列と同じように機能し、unset $array正常に動作するはずです。

于 2012-05-08T11:16:10.340 に答える
1

$foo=bar あなたはこれまでに行うことはできません-それはbashでの間接的な割り当てがどのように機能するかではありません。残念ながら、間接的な配列割り当てを実行できることはksh93で利用可能な機能ですが、bashで正式に文書化された利用可能な機能ではありません。

BashFAQ#6の引用(一般的な間接変数の使用について詳しく知りたい場合は、完全に読む必要があります):

POSIXシェルまたはBourneシェルでその機能を複製できるトリックは認識していません(安全に実行するのが非常に難しいevalを使用しない場合)。Bashはほとんどそれを行うことができます-いくつかの間接的な配列トリックは機能し、他は機能しません、そして関連する構文が将来のリリースで安定したままであるかどうかはわかりません。したがって、これは自己責任での使用と考えてください。

# Bash -- trick #1.  Seems to work in bash 2 and up.
realarray=(...) ref=realarray; index=2
tmp="$ref[$index]"
echo "${!tmp}"            # gives array element [2]

# Bash -- trick #2.  Seems to work in bash 3 and up.
# Does NOT work in bash 2.05b.
tmp="$ref[@]"
printf "<%s> " "${!tmp}"; echo    # Iterate whole array.

ただし、正常に機能するため、クリアはより簡単unset $arrayです。

于 2012-05-08T11:19:30.920 に答える