2016-06-27 10 views
1

シェルスクリプトの初心者です。私はサイズnの配列を作成しようとしています。実行時にnがユーザによって入力されます。シェルスクリプトでユーザー入力を使用して動的配列を埋め込む

while [ $i -lt $n ] 
do 

    echo For person $i enter the name? 
    read io 
    eval Name[$index]= $io 

done 

これを実行しようとすると、ループがユーザーからの入力を取得するたびに値が上書きされます。

例:人1が - トム、人2が - ジョンの場合。次に、スクリプトの最後にすべての人物の名前を表示しようとすると、person 1の名前がperson n番目の名前で上書きされます(つまり、すべての名前は配列ではなく1つの変数に格納されます)。

どこか間違っていると誰かに教えてもらえますか?

+0

あなたは '$のindex'と' eval'を取り除くことができます。単に 'eval Name [$ index] = $ io'を' Name =( "$ {Name [@]}" "$ io") 'に置き換えてください。 – alvits

答えて

0
  • あなたはそれが最終的に終了するようにループでiをインクリメントする必要があります。この行は1でiをインクリメント:

    let i+=1 
    
  • あなたはeval Name[$index]= $ioevalを使用する必要はありません。

  • indexという変数はありません(コードサンプルには少なくともありません)。私はあなたがそこにiを使用することを意味すると仮定します。

(すなわち、Name[$index]Name[$i]する必要があります)このコードは動作します:

#!/bin/sh -e 

Name=() 
i=0 

while [ $i -lt 4 ] 
do 
    echo For person $i enter the name? 
    read io 
    Name[$i]=${io} 
    let i+=1 
done 

echo names: 
for n in "${Name[@]}" 
do 
    echo $n 
done 
+0

ありがとう@ tony19.Itは私のために働いた。私は、同じループの中に複数の配列値を印刷しようとしている:person:1 - print name、age、dob、etc .. so私は3つの配列。 "echo person 1 {$ Name [$ i]}"を実行しようとすると、変数Nameの対応する値にアクセスできません。むしろ単に "Name [0]"を表示します。この場合の構文はありますか? –

関連する問題