Как добавить числа к переменной в Bash‑скрипте
Узнайте синтаксис сложения чисел к переменным в Bash‑скриптах. Исправьте ошибки с помощью $(( )) и избегайте пробелов вокруг знака равенства. Руководство примером
Как правильно добавить числа к переменной в Bash‑скрипте? У меня есть 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
Какой правильный синтаксис для добавления значения $metab к $num в Bash?
Правильный синтаксис для добавления значения переменной $metab к $num в Bash — это num=$((num + metab)) или ((num += metab)). В строке 16 вашего скрипта присутствует неверный синтаксис с пробелами вокруг знака =; Bash воспринимает это как попытку выполнить команду, а не арифметическое выражение.
Ниже приведены корректные способы сложения чисел в Bash.
Содержание
- Базовый синтаксис арифметики
- Пример исправленного скрипта
- Множественные методы арифметики
- Правила присваивания переменных
- Распространённые ошибки
Базовый синтаксис арифметики
Самый распространённый и переносимый способ выполнения арифметических операций в Bash — это синтаксис $(( )):
num=$((num + metab))
Этот синтаксис:
- Оценивает арифметическое выражение внутри
(( )) - Автоматически расширяет переменные (внутри не нужен
$) - Возвращает результат
- Позволяет сразу присвоить переменной
Пример исправленного скрипта
Вот ваш исправленный скрипт с правильным синтаксисом:
#!/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 }')
num=$((num + metab)) # Правильный синтаксис — без пробелов вокруг =, корректная арифметика
done
echo "$num"
done
Множественные методы арифметики
Ниже несколько способов добавить числа к переменным в Bash:
1. Расширение арифметики (рекомендуется)
num=$((num + metab))
2. Оператор сложения с присваиванием
((num += metab))
3. Команда expr (устаревший способ)
num=$(expr "$num" + "$metab")
4. Команда let
let "num += metab"
5. Пользовательская функция (POSIX)
addNumbers() {
local IFS='+'
printf "%s\n" "$(( $* ))"
}
num=$(addNumbers "$num" "$metab")
Правила присваивания переменных
Критическое правило: никогда не ставьте пробелы вокруг знака = при присваивании переменных:
# ВЕРНО — без пробелов
num=5
num=$((num + metab))
((num += metab))
# НЕВЕРНО — пробелы вызывают ошибки
num = 5 # Попытка выполнить команду «num» с аргументом «=5»
num = $num + $metab # Попытка выполнить команду «num» с аргументами «=10+20»
Согласно Bash Cookbook от O’Reilly, «нельзя ставить пробелы вокруг знака = при присваивании переменной в Bash».
Распространённые ошибки
- Пробелы вокруг знака
=:num = $num + $metab— ❌ - Отсутствие арифметического синтаксиса:
num=$num + $metab— ❌ (это просто строковое конкатенирование) - Использование
$внутри арифметики:num=$(($num + $metab))— ✅ (работает, но лишнее) - Неэкранированные переменные в арифметике:
num=$((num + $metab))— ✅ (работает, но$внутри не нужен)
Самый надёжный и читаемый вариант для вашего скрипта — num=$((num + metab)). Этот синтаксис переносим, эффективен и соответствует лучшим практикам Bash для арифметических операций.
Источники
- Unix & Linux Stack Exchange – Как добавить арифметические переменные в скрипте
- Linux Bash Shell Scripting Tutorial – Выполнение арифметических операций
- Stack Overflow – Как добавить числа в Bash‑скрипте?
- O’Reilly bash Cookbook – Выполнение арифметики в скрипте
- GeeksforGeeks – Операторы арифметики в Bash‑скрипте
Вывод
- Используйте
num=$((num + metab))для надёжного выполнения арифметики - Никогда не ставьте пробелы вокруг знака
=при присваивании переменных - Синтаксис
$(( ))переносим, эффективен и рекомендуется для большинства арифметических операций - Существует несколько методов, но
$(( ))обеспечивает лучший баланс читаемости и производительности - После замены
num= $num + $metabнаnum=$((num + metab))ваш скрипт будет работать корректно