#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]'
.