обращение к переменной цикла внутри цикла

[119338] Используйте [119769]ssh-agent[119770] для автоматической аутентификации (с именем оболочки в качестве аргумента, чтобы переменные окружения агента были установлены в этой новой оболочке). Добавьте ключ с помощью [119771]ssh-add[119772] и введите пароль только один раз.

1
02.06.2015, 14:19
4 ответа

Вы можете использовать два метода, если вы хотите сохранить ваш данный пример:

  1. Использование Eva: Eva Expr \ $ {l_ $ i} + $ b
  2. Использование ссылочной переменной: = L_ $ i; EXPR $ {! Ref} + $ B;

Как упомянул Choroba Bash , чувствителен к регистру, поэтому, пожалуйста, будьте осторожны с вашими именами переменной.

1
27.01.2020, 23:27
l_1=10 l_2=20 l_3=30 l_4=40 l_5=50
b=100
for i  in    1 2 3 4 5
do     echo "$((sum=l_$i+b))"
done

Значение $sum установлено выше в текущей оболочке - оно может быть расширено или изменено обычным способом. Это происходит без накладных расходов на подоболочку/трубу, необходимых для вызова/включения expr и его родительской оболочки для каждой итерации.

OUTPUT:

110
120
130
140
150

Или, если вы действительно хотите использовать expr:

for i  in  1 2 3 4 5
do     sum=`expr "$((l_$i))" + "$b"`
       echo "$sum"
done

OUTPUT:

110
120
130
140
150
0
27.01.2020, 23:27

Я не эксперт по bash, но вот что я придумал

#!/bin/bash
 b=1
 l_1=1
 l_2=2
 l_3=3
 for i in '$l_'{1,2,3}
 do
   eval dvar="${i}"
   sum=$(($dvar + $b))
 done

Переменная i цикла for будет инициализирована как '$ l_1', '$ l_2' и так далее. Вызов eval затем преобразует значение i в dvar , которое затем может быть использовано в арифметическом выражении.

0
27.01.2020, 23:27

Вместо использования l_i или списка в виде строк используйте массивы:

#! /bin/bash
b=11
l=(12 24 46 68 92)
for i in "${l[@]}" ; do
     ((sum=i+b))
     echo $sum
done
2
27.01.2020, 23:27

Теги

Похожие вопросы