2016-06-27 4 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 - Джон. Затем, когда я пытаюсь напечатать имена всех людей в конце скрипта, имя человека 1 будет перезаписано человеком n th name (что означает, что все имена хранятся в одной переменной вместо массива).

Может кто-нибудь сказать мне, где я иду не так?

+0

Вы можете избавиться от '$ index' и' eval'. Просто замените 'eval Name [$ index] = $ io'' Name = ("$ {Name [@]}" "$ io") '. – alvits

ответ

0
  • Вам необходимо прирастить i в петле, чтобы в конечном итоге выйти. Эта линия увеличивает i от 1:

    let i+=1 
    
  • Вам не нужно использовать eval в eval Name[$index]= $io.

  • Нет переменной с именем 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 - имя печати, возраст, dob и т. Д. Затем я следовал той же методике объявления 3 массивов , Когда я пытался сделать «echo person 1 {$ Name [$ i]}", я не могу получить доступ к соответствующему значению переменной Name. скорее, он просто печатает «Имя [0]». Есть ли синтаксис для этого случая? –

 Смежные вопросы

  • Нет связанных вопросов^_^