Как добавить числа в 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}') # (строка 15)
num= $num + $metab # (строка 16)
done
echo "$num"
done
Как правильно выполнить добавление значения переменной metab
к переменной num
в этой строке?
5 ответ(ов)
В 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.
Ваша ошибка в синтаксисе при использовании инкремента в оболочке bash. В Bash инкремент можно выполнять разными способами, и если вы хотите, чтобы ваш код был подобен тому, что вы видите в других языках программирования, вы можете использовать следующие варианты:
- Используя
((...))
для арифметических операций:
i=0
((i++))
echo $i
Этот код корректен, и при его выполнении вы получите 0
, потому что постфиксный инкремент i++
сначала вернет текущее значение i
, а затем увеличит его на 1.
- Если вы хотите, чтобы
echo
выводил уже инкрементированное значение, используйте префиксный инкремент++i
:
i=0
((++i))
echo $i
В этом случае вывод будет 1
, так как значения i
будет увеличено до выполнения команды echo
.
- Можно также использовать
let
для инкремента:
i=0
let "i++"
echo $i
Этот вариант тоже вернет 1
, как и префиксный инкремент.
- Еще один популярный способ - использование
$((...))
:
i=0
i=$((i + 1))
echo $i
Этот синтаксис также увеличивает i
на 1 и выведет результат 1
.
Надеюсь, это поможет вам запомнить синтаксис инкремента в Bash!
Я тоже очень люблю этот метод. Он действительно создает меньше беспорядка в коде:
count=$[count+1]
Этот синтаксис позволяет удобно увеличивать значение переменной count
на 1. Однако стоит отметить, что эта форма синтаксиса считается устаревшей в некоторых версиях Bash и лучше использовать более современный вариант:
count=$((count + 1))
Такой подход является более читаемым и совместим с различными версиями оболочки.
Вы написали небольшой скрипт на Bash, который считывает два значения с ввода и выводит их сумму. Давайте разберем его строчку за строчкой:
#!/bin/bash
Эта строка указывает на интерпретатор, который должен использоваться для выполнения скрипта — в данном случае это Bash.
read X
Команда read
считывает строку ввода и сохраняет ее в переменную X
. Пользователю будет предложено ввести значение, и когда он нажмет Enter, значение будет сохранено.
read Y
Аналогично, эта строка считывает вторую строку ввода и сохраняет ее в переменной Y
.
echo "$(($X+$Y))"
Здесь происходит вычисление суммы значений переменных X
и Y
. $((...))
используется для арифметических операций в Bash. Результат суммы затем передается команде echo
, которая выводит его на экран.
Таким образом, этот скрипт сначала запрашивает у пользователя два числа, а затем выводит их сумму. Убедитесь, что введенные вами данные являются корректными числами, чтобы избежать возможных ошибок при выполнении скрипта.
Если у вас остались вопросы или требуется дополнительная информация, не стесняйтесь спрашивать!
Вот перевод вашего скрипта на русский язык в стиле ответа на вопрос на 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
для работы с дробными числами.
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash
Расширение переменных внутри одинарных кавычек в команде Bash
Как разделить большой текстовый файл на меньшие файлы с равным количеством строк?