for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Привет, мне нужно упрощенное выражение для третьей строки, возможно, такое, которое не использует подстановку команд.
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done
Привет, мне нужно упрощенное выражение для третьей строки, возможно, такое, которое не использует подстановку команд.
bash
и неC
так, поэтому удалите все;
- если вы не пишете это в единственной строке.declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
$(( ... ))
это арифметическое расширение, а не подстановка команд.Ответы:
Используя арифметическое расширение:
Используя устаревшую
expr
утилиту:Использование
bc -l
(на-l
самом деле не нужно в этом случае, так как математические функции не используются):Использование
bc -l
в качестве совместного процесса (он действует как своего рода вычислительная служба в фоновом режиме¹):Этот последний выглядит (возможно) чище в
ksh93
:Once Это однажды решило проблему для меня, когда мне нужно было обработать большое количество входных данных в цикле. Обработка требовала некоторых вычислений с плавающей запятой, но порождение
bc
в цикле несколько раз оказалось чрезвычайно медленным. Да, я мог бы решить это многими другими способами, но мне было скучно ...источник
Вы можете упростить:
чтобы:
источник
Вы можете использовать
let
команду для принудительного расчета.Обратите внимание, что нам не нужна
$k
эта структура; простойk
сделает работу.источник
a=2whateverk+1
в текущем каталоге будет вызван файл . Хуже того, если есть файлa=2+b[$(reboot)]k+1
, который вызываетreboot
команду. Лучше всего использовать((...))
здесь (((a = 2 * k + 1))
) или синтаксис POSIX:a=$((2 * k + 1))
let a="2*k+1"
чтобы решить это.Арифметическое расширение, которое вам, вероятно, нужно:
На самом деле вам не нужно использовать переменную:
Или переменная подсчета может быть перемещена в
for ((…))
цикл:для ((…)) цикла
И, в этом случае, арифметическое расширение также может быть перемещено внутрь цикла for:
Или, чтобы получить все значения в массиве:
Нет формулы
Но, вероятно, самый короткий способ избежать арифметического расширения - это увеличить переменную дважды:
Или, что еще проще, просто используйте seq:
источник