Intereting Posts

доступ к переменной цикла в цикле

List = 1 2 3 4 5 for i in $LIST do sum=`expr $l_$i + $b` done 

здесь l_1 , l_2 , l_3 , l_4 и l_5 – переменные, имеющие некоторые значения. когда я пытаюсь получить доступ к этим значениям в цикле for, используя переменную цикла i , значение i становится замененным в выражении, то есть оператор (1 + $b) выполняется вместо ($l_1 + $b) . Я пробовал различные комбинации символа $ а также использовал paranthesis, но ничего не работает. Пожалуйста помоги!!

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

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

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

  1. используя eval: eval expr \${L_$i} + $b
  2. используя ссылочную переменную: REF=L_$i; expr ${!REF} + $b; REF=L_$i; expr ${!REF} + $b;

Как сказал choroba, bash чувствителен к регистру, поэтому, пожалуйста, будьте осторожны с именами переменных.

 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 и его родительской оболочки для каждой итерации.

ВЫВОД:

 110 120 130 140 150 

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

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

ВЫВОД:

 110 120 130 140 150 

Я не эксперт по 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, которое затем может быть использовано в арифметическом выражении.