2012-05-08 13 views
8

2つのこと、最初はこれがこのフォーラムの最初の質問です。書式設定が全面的に行われていれば謝ります。二番目に、たくさんのbashスクリプトを書いていないので、私が作ったスクリプトの間にかなり長い時間がかかる傾向があります。

それは私の質問です。

は、(クリア配列$配列が含まれている)bashでこのような何かをすることが可能です:
$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の配列をクリアする必要があります。それは簡単ですが、どこかでハードコードしないでください。

ありがとうございます。

+0

http://mywiki.wooledge.org/BashFAQ/048を参照してください。re:eval - short formの使用は実際にはアドバイスされていないことです。 –

+0

リンクありがとう!私は 'eval'はあなたがそれに悪いものを注入することができるので、あなたが' evel'を慎重にしなければ、あなた自身が何かばかげたものを行うことができるので、推薦された方法ではないことを読んでいます。このスクリプトは自分でのみ使用されますが、私は別の解決策のためにそれをスワップすることを検討します。 – Qben

+0

あなたが本当に望むものは、連想配列です。彼らはバッシュ4で利用可能です。 – Dunes

答えて

11

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

+0

あなたはそれが簡単なことを意味しますか? :)私はちょうど$ array1と$ array2をそのまま残している$ array変数の設定を解除すると考えていました。しかし、あなたの提案をテストした後、それは有望に見えます。本当にありがとう! – Qben

+0

@Qben 'unset array'は配列変数自身を設定解除します。 'unset $ array'は広告として動作します。 –

+0

@Qben:間接的に 'unset 'すると変数を引用することをお勧めします:' unset "$ array" ' –

1

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

私たちは、POSIXかでその機能を複製することができます任意のトリックに気づいていない。(あなたは、一般的に、間接変数の使用についての詳細を知ることに興味を持っている場合は、完全に読まれるべきである)BashFAQ #6を引用

Bourneシェル(evalを使用していない、これは安全に行うのが非常に難しい)。間接的な配列の仕掛けが機能していないものもあれば、そうでないものもありますが、将来のリリースでは構文が安定しているかどうかはわかりません。したがって、これをあなた自身のリスクハックでの使用とみなしてください。

# 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が正常に動作しますしかし、クリアは、単純です。

+0

私は彼が逆参照を望んでいるとは思っていません、彼はちょうど配列を空にしたいと思っています – c00kiemon5ter

+0

@ c00kiemon5ter確かに、しかし答えています。配列を空にする方法だけが、何か他のことをしようとするときに誰かが不思議に思うことを残すでしょう。私は直接オン・ポイントの回答を追加しましたが、「$ array = ...」の代わりに何をすればいいのでしょうかというより大きな質問に答えることは価値があると思いますか? –

+0

間接代入は 'declare $ foo = bar' –

-1
array=() 

アレイを消去します。あなたが望んだのはそれだと思います。

+0

いいえ、そうではありません、あなたはその点を見逃しました。質問は間接的です。 –

関連する問題