7

Как добавить числа в Bash-скрипте?

24

У меня есть 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}') # (строка 15)
        num= $num + $metab   # (строка 16)
    done
    echo "$num"
done

Как правильно выполнить добавление значения переменной metab к переменной num в этой строке?

5 ответ(ов)

0

В Bash вы можете выполнять арифметические операции с использованием конструкции ((...)). Пример, который вы привели, показывает, как можно складывать целые числа. В данном случае, переменной num присваивается значение 5, а затем к ней прибавляется значение переменной x, равное 6. Результат выводится на экран:

num=5
x=6
(( num += x ))
echo $num   # ==> 11

Однако стоит учитывать, что Bash поддерживает только целочисленную арифметику. Если ваша команда AWK возвращает дробное число, вам придется изменить подход. Ниже представлен ваш код, переписанный так, чтобы вся арифметика выполнялась в AWK:

num=0
for ((i=1; i<=2; i++)); do
    for j in output-$i-*; do
        echo "$j"
        num=$(
           awk -v n="$num" '
               /EndBuffer/ {sum += $2}
               END {print n + (sum/120)}
           ' "$j"
        )
    done
    echo "$num"
done

Этот код использует AWK для выполнения сложения и деления, что позволяет обрабатывать дробные числа. Переменная num здесь инициализируется значением 0, и в каждом проходе цикла for обновляется с использованием суммы, рассчитанной в AWK.

0

Ваша ошибка в синтаксисе при использовании инкремента в оболочке bash. В Bash инкремент можно выполнять разными способами, и если вы хотите, чтобы ваш код был подобен тому, что вы видите в других языках программирования, вы можете использовать следующие варианты:

  1. Используя ((...)) для арифметических операций:
i=0
((i++))
echo $i

Этот код корректен, и при его выполнении вы получите 0, потому что постфиксный инкремент i++ сначала вернет текущее значение i, а затем увеличит его на 1.

  1. Если вы хотите, чтобы echo выводил уже инкрементированное значение, используйте префиксный инкремент ++i:
i=0
((++i))
echo $i

В этом случае вывод будет 1, так как значения i будет увеличено до выполнения команды echo.

  1. Можно также использовать let для инкремента:
i=0
let "i++"
echo $i

Этот вариант тоже вернет 1, как и префиксный инкремент.

  1. Еще один популярный способ - использование $((...)):
i=0
i=$((i + 1))
echo $i

Этот синтаксис также увеличивает i на 1 и выведет результат 1.

Надеюсь, это поможет вам запомнить синтаксис инкремента в Bash!

0

Я тоже очень люблю этот метод. Он действительно создает меньше беспорядка в коде:

count=$[count+1]

Этот синтаксис позволяет удобно увеличивать значение переменной count на 1. Однако стоит отметить, что эта форма синтаксиса считается устаревшей в некоторых версиях Bash и лучше использовать более современный вариант:

count=$((count + 1))

Такой подход является более читаемым и совместим с различными версиями оболочки.

0

Вы написали небольшой скрипт на Bash, который считывает два значения с ввода и выводит их сумму. Давайте разберем его строчку за строчкой:

#!/bin/bash

Эта строка указывает на интерпретатор, который должен использоваться для выполнения скрипта — в данном случае это Bash.

read X

Команда read считывает строку ввода и сохраняет ее в переменную X. Пользователю будет предложено ввести значение, и когда он нажмет Enter, значение будет сохранено.

read Y

Аналогично, эта строка считывает вторую строку ввода и сохраняет ее в переменной Y.

echo "$(($X+$Y))"

Здесь происходит вычисление суммы значений переменных X и Y. $((...)) используется для арифметических операций в Bash. Результат суммы затем передается команде echo, которая выводит его на экран.

Таким образом, этот скрипт сначала запрашивает у пользователя два числа, а затем выводит их сумму. Убедитесь, что введенные вами данные являются корректными числами, чтобы избежать возможных ошибок при выполнении скрипта.

Если у вас остались вопросы или требуется дополнительная информация, не стесняйтесь спрашивать!

0

Вот перевод вашего скрипта на русский язык в стиле ответа на вопрос на StackOverflow.com:

#!/usr/bin/bash

# Целые числа
# ================#

num1=30
num2=5

echo $(( num1 + num2 ))          # Сумма
echo $(( num1 - num2 ))          # Вычитание
echo $(( num1 * num2 ))          # Умножение
echo $(( num1 / num2 ))          # Деление
echo $(( num1 % num2 ))          # Остаток от деления

read -p "Введите первое число: " a
read -p "Введите второе число: " b
# Мы можем сохранить результат
result=$(( a + b ))
echo "Сумма чисел $a и $b равна $result" # \ используется для экранирования &

# Десятичные числа
# Bash поддерживает только целые числа, поэтому мы должны использовать инструмент, такой как bc
# ===============#

num1=534.3
num2=3.4

echo $num1 + $num2 | bc            # Сложение
echo $num1 - $num2 | bc            # Вычитание
echo $num1 \* $num2 | bc            # Умножение
echo "scale=20; $num1 / $num2" | bc # Деление с определением точности
echo $num1 % $num2 | bc            # Остаток от деления (учтите, что это может не сработать с bc, так как он также работает с вещественными числами)

# Мы можем сохранить результат
result=$( echo $num1 + $num2 | bc )
echo "Результат: $result"

## Бонус ##
# Вызов встроенных методов bc 

num=27

echo "scale=2; sqrt($num)" | bc -l # bc поддерживает вычисление квадратного корня

echo "scale=2; $num^3" | bc -l      # Вычисление степени

Этот скрипт в Bash показывает, как выполнять арифметические операции с целыми и вещественными числами, используя встроенные возможности Bash, а также утилиту bc для работы с дробными числами.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь