получить несколько значений в приглашении и сохранить в массиве

#bash #loops

#bash #циклы

Вопрос:

Я хочу получить несколько значений от пользователя в моем скрипте bash.

например, мне нужно иметь цикл для получения $x значений в приглашении, подобных этому:

 Enter parameter 1 : 10
Enter parameter 2 : 12
Enter parameter 3 : 24
  

Я написал этот код:

 x=3
for (( i=1; i<=$x; i   ))
do
    read -p "Enter parameter ${i} : "  params
done

for i in ${params[@]}
do
   echo $i
done
  

этот код отображает приглашение 3 раза и получает 3 разных значения, но когда я пытаюсь отобразить значения в for i in ${params[@]} , я получаю только последнее значение.

что мне делать?

Ответ №1:

Другой способ — просто добавить временную переменную в выходной массив:

 #!/usr/bin/env bash

x=3 params=()
for (( i = 1; i <= x;   i )); do
   IFS= read -rp "Enter parameter #$i: " tmp || continue
   params =("$tmp")
done

printf '%sn' "${params[@]}"
  

Ответ №2:

Назовите запись в массиве, которую read следует сохранить в:

 params=()
for (( i=1; i<=$x; i   ))
do
    read -p "Enter parameter ${i} : "  'params[i]'
done
  

Например:

 bash-5.0$ foo=()
bash-5.0$ read foo[1]
ls
bash-5.0$ read foo[2]
ls
bash-5.0$ read foo[3]
bar
bash-5.0$ echo "${foo[@]}"
ls ls bar
bash-5.0$ echo "${!foo[@]}"
1 2 3
  

Комментарии:

1. Предполагается, что op может объявлять индексированный массив с помощью declare -a params

2. touch paramsi и у вас возникнет проблема 🙂 Я предлагаю заключить в кавычки 'params[i]' .