Другое

Как добавить числа к переменной в Bash‑скрипте

Узнайте синтаксис сложения чисел к переменным в Bash‑скриптах. Исправьте ошибки с помощью $(( )) и избегайте пробелов вокруг знака равенства. Руководство примером

Как правильно добавить числа к переменной в Bash‑скрипте? У меня есть Bash‑скрипт, и у меня возникла проблема в строке 16. Как взять предыдущее значение из строки 15 и добавить его к переменной в строке 16?

bash
#!/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 — это синтаксис $(( )):

bash
num=$((num + metab))

Этот синтаксис:

  • Оценивает арифметическое выражение внутри (( ))
  • Автоматически расширяет переменные (внутри не нужен $)
  • Возвращает результат
  • Позволяет сразу присвоить переменной

Пример исправленного скрипта

Вот ваш исправленный скрипт с правильным синтаксисом:

bash
#!/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. Расширение арифметики (рекомендуется)

bash
num=$((num + metab))

2. Оператор сложения с присваиванием

bash
((num += metab))

3. Команда expr (устаревший способ)

bash
num=$(expr "$num" + "$metab")

4. Команда let

bash
let "num += metab"

5. Пользовательская функция (POSIX)

bash
addNumbers() {
    local IFS='+'
    printf "%s\n" "$(( $* ))"
}
num=$(addNumbers "$num" "$metab")

Правила присваивания переменных

Критическое правило: никогда не ставьте пробелы вокруг знака = при присваивании переменных:

bash
# ВЕРНО — без пробелов
num=5
num=$((num + metab))
((num += metab))

# НЕВЕРНО — пробелы вызывают ошибки
num = 5        # Попытка выполнить команду «num» с аргументом «=5»
num = $num + $metab  # Попытка выполнить команду «num» с аргументами «=10+20»

Согласно Bash Cookbook от O’Reilly, «нельзя ставить пробелы вокруг знака = при присваивании переменной в Bash».

Распространённые ошибки

  1. Пробелы вокруг знака =: num = $num + $metab — ❌
  2. Отсутствие арифметического синтаксиса: num=$num + $metab — ❌ (это просто строковое конкатенирование)
  3. Использование $ внутри арифметики: num=$(($num + $metab)) — ✅ (работает, но лишнее)
  4. Неэкранированные переменные в арифметике: num=$((num + $metab)) — ✅ (работает, но $ внутри не нужен)

Самый надёжный и читаемый вариант для вашего скрипта — num=$((num + metab)). Этот синтаксис переносим, эффективен и соответствует лучшим практикам Bash для арифметических операций.

Источники

  1. Unix & Linux Stack Exchange – Как добавить арифметические переменные в скрипте
  2. Linux Bash Shell Scripting Tutorial – Выполнение арифметических операций
  3. Stack Overflow – Как добавить числа в Bash‑скрипте?
  4. O’Reilly bash Cookbook – Выполнение арифметики в скрипте
  5. GeeksforGeeks – Операторы арифметики в Bash‑скрипте

Вывод

  • Используйте num=$((num + metab)) для надёжного выполнения арифметики
  • Никогда не ставьте пробелы вокруг знака = при присваивании переменных
  • Синтаксис $(( )) переносим, эффективен и рекомендуется для большинства арифметических операций
  • Существует несколько методов, но $(( )) обеспечивает лучший баланс читаемости и производительности
  • После замены num= $num + $metab на num=$((num + metab)) ваш скрипт будет работать корректно
Авторы
Проверено модерацией
Модерация