2016-06-29 6 views
0

大括弧で囲まれた文字列値を持つ配列を作成したいと思います。しかし、毎回予期せぬ出力が得られています。角括弧で囲まれたbash配列

selections=() 
for i in $choices   
do      
    selections+=("role[${filenames[$i]}]") 
done 

echo ${selections[@]}                

選択肢が12たし、配列filenames[1]filenames[2]は値'A'を開催し、'B'場合、私は選択の配列が文字列role[A]を保持したい、とrole[B]

代わりに私が手出力だけですroles

+3

これは動作するはずです。完全なコードを表示できますか? – anubhava

+1

申し訳ありませんが、申し立ては信頼できません。あなたのコードが出力として 'roles'を生成する方法はありません。たぶんそれはちょうど 'ロール[A]'を生成するでしょうか?それ以外の場合は、表示されている出力は、あなたが提示したコードによって生成されていません。 –

+1

@ JohnBollinger、それは実際に信頼できる。 glob展開を考えてみましょう。結果として 'role [abcs]'があり、 'roles'がディスクに存在する場合、' rolea'や 'roleb'に展開できるのと同じように' roles'に展開することができます。 –

答えて

2

私が変数filenameschoicesに割り当てた値に応じて、あなたが提示したコードを出力するかどうかを指定できます。

まず、私はbashが索引付け観察アレイはから始まるインデックスを付け、ないれます。値12を配列filenamesのインデックスとして使用し、2つの要素のみを持つインデックス付き配列の場合は、${filenames[2]}が何も展開されていない可能性があります。あなたはそのようfilenamesを初期化する場合、これは、結果、次のようになります。

代わり
# NOT WHAT YOU WANT: 
filenames=(A B) 

、個別に配列要素を割り当てる、またはインデックス0でダミーの値を追加し、次のいずれか

# Could work: 
filenames=('' A B) 

次に、私はの不審なよchoices。あなたは配列でプレーしているので、私はあなたがそうのように、配列としてchoicesを初期化している可能性があることを推測:

# NOT CONSISTENT WITH YOUR LATER USAGE: 
choices=(1 2) 

インデックスを指定せずに配列値の変数を展開する場合は、インデックスを指定したかのように、それはあります0。上記の初期化では、$choicesは、1に拡張されます。1 2ではなく、フラットな文字列としてchoicesを初期化し、次のいずれか:

# Could work: 
choices='1 2' 

または異なって、それを展開します。

# or expand it this way: 
for i in "${choices[@]}" 

2つの可能性があります。ところで、見積もりを見落としてはいけません。その特定のフォームは配列要素ごとに1語に拡張されますが、引用符を除いて配列要素は単語分割やその他の拡張が行われます(ただし、使用している特定の値この場合)。

引用は、一般にechoコマンドにも適用されます。拡張を引用しない場合は、すべてのケースで意図したとおりに行うと確信するためにコードをさらに慎重に分析する必要があります。単語の分割だけでなく、パス名の拡張や他のいくつかの対象になります。あなたの場合、作業ディレクトリ(thanks @CharlesDuffy)にあるファイルの名前に応じて、パス名拡張を実行する可能性があります。 farただ引用するだけで安全です。

とにかく、ここで完全なデモンストレーション逐語的にあなたのコードを組み込むとしたい出力を生成します:

#!/bin/bash 

filenames=('' 'A' 'B') 
choices="1 2" 

selections=() 
for i in $choices 
do 
    selections+=("role[${filenames[$i]}]") 
done 

echo ${selections[@]} 

# better: 
# echo "${selections[@]}" 

出力:

役割[A]ロール[B]

最後に、私がコメントで見たように、あなたが持っていると主張する入力(変数値)を考えれば、あなたのコードが "役割"を出力する方法はありません。それが実際にあなたが見ているものであれば、あなたが提示したコードには関連していないか、入力があなたと異なるものです。

+1

あなたの答えに与えるコードが、OPが望む出力を生成するかどうかは、そのコードを実行するカレントディレクトリ内のファイルに依存します。それらに 'roleA'または' roleB'という名前のファイルがある場合、出力は 'role [A]'や 'role [B]'ではなく、それらのファイルの名前になります。これを修正するには、引用符を修正する必要があります。 –

+1

最後に選択配列を引用すると、それがうまくいきました。ご協力いただきありがとうございます! – veilig

+0

@CharlesDuffy、あなたはあなたのコメントを予期して明示的に(ただし別の言葉で)答えを編集したので、あなたは絶対に正しいです。 –

関連する問題