У меня есть этот сценарий Bash, и у меня возникла проблема в строке 16. Как я могу взять предыдущий результат в строке 15 и добавить его в переменную в строке 16?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Ответы:
Для целых чисел :
Используйте арифметическое расширение :
$((EXPR))
Использование внешней
expr
утилиты. Обратите внимание, что это необходимо только для действительно старых систем.Для плавающей запятой :
Bash не поддерживает это напрямую, но есть пара внешних инструментов, которые вы можете использовать:
Вы также можете использовать научную запись (например,
2.5e+2
).Общие подводные камни :
При установке переменной у вас не должно быть пробелов по обе стороны
=
, иначе это заставит оболочку интерпретировать первое слово как имя запускаемого приложения (например,num=
илиnum
)num= 1
num =2
bc
иexpr
ожидайте каждого числа и оператора в качестве отдельного аргумента, поэтому пробелы важны. Они не могут обрабатывать аргументы как3+
+4
.num=`expr $num1+ $num2`
источник
num1
иnum2
существовали и имели целочисленные значения?$((..))
арифметическая оценка выполняется в bash.expr
выполняется как отдельный процесс, поэтому он будет намного медленнее. используйте последний в системах, где арифметическая оценка не поддерживается (sh! = bash)$((…))
как POSIX стандартизирован, это становится все более редким, чтоexpr
необходимо.Используйте
$(( ))
арифметическое расширение.См. Главу 13. Арифметическое Расширение для получения дополнительной информации.
источник
191.003 + 190
.Есть тысяча и один способ сделать это. Вот одно из них
dc
(настольный калькулятор с обратной точностью, который поддерживает арифметику с неограниченной точностью):Но если это слишком для вас (или имеет значение переносимости), вы можете сказать,
Но, возможно, вы один из тех, кто считает RPN непристойным и странным; не волнуйся!
bc
здесь для вас:Тем не менее, есть некоторые несвязанные улучшения, которые вы могли бы внести в ваш скрипт:
Как описано в Bash FAQ 022 , Bash изначально не поддерживает числа с плавающей запятой. Если вам необходимо суммировать числа с плавающей запятой, необходимо использовать внешний инструмент (например,
bc
илиdc
).В этом случае решение будет
Добавить накопить возможно числа с плавающей точкой в
num
.источник
В Баш,
Обратите внимание, что bash может обрабатывать только целочисленную арифметику, поэтому, если ваша команда awk возвращает дробь, вы захотите изменить дизайн: здесь ваш код немного переписан, чтобы выполнить всю математику в awk.
источник
Я всегда забываю синтаксис, поэтому захожу в гугл, но потом никогда не нахожу тот, с которым мне знакомо: P. Это самое чистое для меня и более верное тому, что я ожидал на других языках.
источник
источник
Мне тоже очень нравится этот метод, меньше беспорядка:
источник
Вы должны объявить meta как целое число, а затем использовать арифметическую оценку
Для получения дополнительной информации см. Https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic.
источник
Другой переносимый
POSIX
совместимый способ сделать этоbash
, который может быть определен как функция.bashrc
для всех арифметических операторов удобства.и просто вызвать его в командной строке, как,
Идея состоит в том, чтобы использовать Input-Field-Separator (IFS) , специальную переменную,
bash
используемую для разделения слов после раскрытия и разделения строк на слова. Функция изменяет значение локально, чтобы использовать символ разделения слов в качестве оператора суммы+
.Помните, что
IFS
он изменяется локально и НЕ влияет наIFS
поведение по умолчанию вне области действия функции. Отрывок соman bash
страницы,"$(( $* ))"
Представляет список аргументов , переданных расщепляться ,+
а затем значение суммы выводится с помощьюprintf
функции. Функция может быть расширена, чтобы добавить область для других арифметических операций также.источник
источник
использовать встроенную оболочку
let
, она похожа на(( expr ))
источник: https://www.computerhope.com/unix/bash/let.htm
источник