Я хочу получить несколько значений от пользователя в моем сценарии 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[@]}
, я получаю только последнее значение.
Что я должен делать?
Назовите запись в массиве, которую 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
touch paramsi
и у вас будут проблемы :) Предлагаю процитировать 'params[i]'
.
Другой способ — просто добавить временную переменную в выходной массив:
#!/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 '%s\n' "${params[@]}"
Предполагается, что оператор может объявить индексированный массив, используя
declare -a params