Почему эхо комбинированных переменных в течение l oop не работает? - PullRequest
2 голосов
/ 19 февраля 2020

что не так с строкой "эхо" в моем l oop? Должно отображаться значение v1 после 1-го входа, v2 после 2-го входа и v3 после 3-го входа. Вместо этого это просто повторяет $ i. Почему игнорируется $ v? После выполнения l oop я делаю «ручную проверку» переменных-заставок, и они, очевидно, существуют.

Скрипт:

#!/bin/bash
for i in {1..3}
 do
  read -p "Insert value $i: " v$i
  echo "you wrote " $v$i          #I have problem in this line
 done

echo
echo "check of saved values:"
echo $v1
echo $v2
echo $v3

Вывод на консоль:

./input_2.sh
Insert value 1: what
you wrote  1              #output should be: you wrote what
Insert value 2: the
you wrote  2              #output should be: you wrote the
Insert value 3: hell
you wrote  3              #output should be: you wrote hell

check of saved values:
what
the
hell

Спасибо

Ответы [ 4 ]

3 голосов
/ 19 февраля 2020

Как указывалось, вам нужно косвенное расширение переменной. Однако вы также можете использовать массив для группировки связанных значений. v[$i] является допустимым именем для read.

for i in {1..3}
 do
  read -p "Insert value $i: " "v[$i]"
  echo "you wrote ${v[$i]}"
 done

echo
echo "check of saved values:"
echo "${v[1]}"
echo "${v[2]}"
echo "${v[3]}"
3 голосов
/ 19 февраля 2020

Эта строка:

echo "you wrote " $v$i

Пытается записать переменную $v, за которой следует $i.

Вам нужно сохранить имя переменной в переменной, а затем используйте ${!}, например:

varname=v$i
echo "you wrote " ${!varname}

Хорошей практикой будет использование этого имени переменной также для операции read:

#!/bin/bash
for i in {1..3}
 do
  varname=v$i
  read -p "Insert value $i: " $varname
  echo "you wrote " ${!varname}
 done

echo
echo "check of saved values:"
echo $v1
echo $v2
echo $v3
2 голосов
/ 19 февраля 2020

Также работает с printf

for i in {1..3}; {
    varname=v$i
    read -p "Insert value $i: " value 
    printf -v $varname "$value"
    echo  "you wrote $value"
}

echo
echo "check of saved values:"
echo $v1
echo $v2
echo $v3
1 голос
/ 19 февраля 2020

Ты почти у цели. Просто используйте массив и заполните его внутри l oop.

#!/usr/bin/env bash

values=()
for i in {1..3}; do
  read -p "Insert value $i: " v
  values+=("$v")
  printf '%s %s\n' "you wrote" "$v"
done

echo
echo "check of saved values:"
echo ${values[0]}
echo ${values[1]}
echo ${values[2]}

Просто имейте в виду, что массивы bash начинаются с нуля 0 index.


РЕДАКТИРОВАТЬ: Как указал Иван, нулевой индексированный массив может быть изменен в соответствии со значением для l oop.

#!/usr/bin/env bash
values=()
for i in {1..3}; do
  read -p "Insert value $i: " v
  values[$i]="$v"
  printf '%s %s\n' "you wrote" "$v"
done

echo
echo "check of saved values:"
echo ${values[1]}
echo ${values[2]}
echo ${values[3]}
...