Bash linux сложение переменных

Titiaiev / bash-guide-1.md

BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.

break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.

И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе

Что необходимо знать с самого начала

в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash ) поменяйте её на ваш путь.

  1. Коментарии начинаются с символа # (кроме первой строки).
  2. В bash переменные не имеют типа(о них речь пойдет ниже)

Переменные и параметры скрипта

Приведу как пример небольшой пример, который мы разберем:

#!/bin/bash #указываем где у нас хранится bash-интерпретатор
#присваиваем переменной parametr1 значение первого параметра скрипта
parametr1=$1
#присваиваем переменной script_name значение имени скрипта
script_name=$0
# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной.
echo «Вы запустили скрипт с именем $script_name и параметром $parametr1»
# здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных.
echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’
#Выход с кодом 0 (удачное завершение работы скрипта)
exit 0

Результат выполнения скрипта:

ite@ite-desktop:~$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty
Вы запустили скрипт с именем $script_name и параметром $parametr1

После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:

$DIRSTACK — содержимое вершины стека каталогов
$EDITOR — текстовый редактор по умолчанию
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как.
$UID — . содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME — имя текущей функции в скрипте.
$GROUPS — массив групп к которым принадлежит текущий пользователь
$HOME — домашний каталог пользователя
$HOSTNAME — ваш hostname
$HOSTTYPE — архитектура машины.
$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов
$OLDPWD — прежний рабочий каталог
$OSTYPE — тип ОС
$PATH — путь поиска программ
$PPID — идентификатор родительского процесса
$SECONDS — время работы скрипта(в сек.)
$# — общее количество параметров переданных скрипту
$* — все аргументы переданыне скрипту(выводятся в строку)
$@ — тоже самое, что и предыдущий, но параметры выводятся в столбик
$! — PID последнего запущенного в фоне процесса
$$ — PID самого скрипта

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

#!/bin/bash
#в переменную source засовываем первый параметр скрипта
source=$1
#в переменную dest засовываем второй параметр скрипта
dest=$2

# в ковычках указываем имена переменных для сравнения. -eq — логическое сравнение обозначающие «равны»
if [[ «$source» -eq «$dest» ]]
# если они действительно равны, то
then
#выводим сообщение об ошибке, т.к. $source и $dest у нас равны
echo «Применик $dest и источник $source один и тот же файл!»
# выходим с ошибкой (1 — код ошибки)
exit 1
# если же они не равны
else
# то выполняем команду cp: копируем источник в приемник
cp $source $dest
echo «Удачное копирование!»
fi #обозначаем окончание условия.

Результат выполнения скрипта:

ite@ite-desktop:~$ ./primer2.sh 1 1
Применик 1 и источник 1 один и тот же файл!

ite@ite-desktop:~$ ./primer2.sh 1 2
Удачное копирование!

Структура if-then-else используется следующим образом:

Читайте также:  Linux and windows antivirus

В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , test, (( )) или любая другая(или несколько) linux-команда.

test — используется для логического сравнения. после выражения, неоьбходима закрывающая скобка «]»
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.

для построения многоярусных условий вида:

для краткости и читаемости кода, можно использовать структуру:

Условия. Множественный выбор

Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.

#!/bin/bash
echo «Выберите редатор для запуска:»
echo «1 Запуск программы nano»
echo «2 Запуск программы vi»
echo «3 Запуск программы emacs»
echo «4 Выход»
#здесь мы читаем в переменную $doing со стандартного ввода
read doing

case $doing in
1)
/usr/bin/nano # если $doing содержит 1, то запустить nano
;;
2)
/usr/bin/vi # если $doing содержит 2, то запустить vi
;;
3)
/usr/bin/emacs # если $doing содержит 3, то запустить emacs
;;
4)
exit 0
;;
*) #если введено с клавиатуры то, что в case не описывается, выполнять следующее:
echo «Введено неправильное действие»

esac #окончание оператора case.

ite@ite-desktop:~$ ./menu2.sh
Выберите редатор для запуска:
1 Запуск программы nano
2 Запуск программы vi
3 Запуск программы emacs
4 Выход

После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )

Прведу список логических операторв, которые используются для конструкции if-then-else-fi:

-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( < ) # меньше
-le,( <=) # меньше или равно
-gt,(>) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»

С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.

Читайте также:  Посмотреть активные сессии linux

Источник

Арифметические операции в Bash скрипте

Изображение баннера

let это встроенная функция bash, которая позволяет производить базовые арифметические операции.

Используется следующим образом:

Рассмотрим примеры в скрипте let_example.sh

#!/bin/bash # Простая арифметика с let let A=5+4 echo $A # 9 let «A = 5 + 4» echo $A # 9 let A++ echo $A # 10 let «A = 4 * 5» echo $A # 20 let «A = $1 + 30» echo $A # 30 + первый аргумент из командной строки

Разберём команды по очереди:

Строка 4 — Это простейшая форма записи без кавычек.

Помните, что если вычисление идёт без кавычек — ставить пробелы нельзя

Строка 7 — Если поставить кавычки — можно пользоваться пробелом для лучшей читаемости.\

Строка 10 — Увеличиваем значение на 1. Это аналог «a = a + 1».

Строка 16 — В выражение можно включить и другие переменные.

Таблица основных операторов

expr

expr похож на let за исключением того, что вместо сохранения результата в переменную expr по умолчанию печатает ответ.

Но никто не запрещает сохранять результат expr в переменные с помощью command substitution: x = $(expr 2 + 2)

В отличие от let не нужно заключать выражения с пробелами в кавычки

Нужно ставить пробелы вокруг операторов.

expr item1 operator item2

Рассмотрим простой пример:

#!/bin/bash # Простая арифметика с использованием expr expr 5 + 4 expr «5 + 4» expr 5+4 expr 5 \* $1 expr 11 % 2 A= $( expr 10 — 3 ) echo $A # 7

Разберём этот пример пошагово:

Строка 4 — Это базовый синтаксис. Обратите внимание на пробелы и на отсутствие кавычек.

Строка 6 — Если заключить выражение в кавычки его в таком виде и выведет в терминал.

Строка 8 — Если не поставить пробелы выражение будет выведено в терминал без вычисления.

Читайте также:  Orico bta 508 linux driver

Строка 10 — Некоторые символы нужно экранировать.

Строка 12 — Это деление по модулю. Результатом будет остаток от целочисленного деления двух чисел.

Строка 14 — Пример выполнения command substitution чтобы сохранить результат в переменную a.

Двойные скобки

Результат выполнения команды можно легко сохранить в переменную.

На основе этого механизма можно выполнять арифметические действия. Достаточно вместо одной пары скобок использовать две.

Рассмотрим примеры в скрипте

#!/bin/bash # Простая арифметика с двойными скобками A= $(( 4 + 5 )) echo $A # 9 A= $((3+5)) echo $A # 8 B= $(( A + 3 )) echo $B # 11 B= $(( $A + 4 )) echo $B # 12 (( B++ )) echo $B # 13 (( B += 3 )) echo $B # 16 A= $(( 4 * 5 )) echo $A # 20

Строка 4 — Базовый синтаксис. Можно ставить пробелы без использования кавычек.

Строка 7 — Работает и без пробелов.

Строка 10 — Можно использовать переменные без $ перед ними.

Строка 16 — Увеличение переменной на 1. Символ $ не нужен.

Строка 19 — Увеличение переменной на 3. Это краткая форма записи b = b + 3.

Строка 19 — В отличие от других способов символ * не нужно экранировать.

Двойные скобки дают довольно много свободы в форматировании кода.

Они доступны в Bash по умолчанию и их эффективность немного выше. Хотя заметить разницу на современных компьютерах будет непросто.

Сложение

Сложение в bash можно выполнить следущими способами

#!/bin/bash # Bash + # let A=2 B=3 let C=$A+ $B echo $C

#!/bin/bash # Bash + # expr and (( )) D=4 E=5 F=$( expr $D + $E ) G=$(( $D + $D )) echo $F echo $G

Целочисленное деление

В bash по умолчанию реализовано именно целочисленное деление

Рассмотрим, что будет если попытаться поделить числа с помощью let

#!/bin/bash # Целочисленное деление A=100 B=3 let «C = $A / $B » echo «C: $C «

Если вас это не устраивает — используйте bc

Остаток от деления

Остаток от деления можно получить с помощью % следующим оригинальным образом

Float Сложение

Сложение чисел с плавающей точкой можно выполнить с помощью bc

bc

В bash нет родной поддержки деления чисел с плавающей точкой. Но есть утилиты, которые умеют это делать.

Что будет если попытаться поделить числа с помощью let

#!/bin/bash # Деление с let A=100 B=3 let «C = $A / $B » echo «C: $C «

Чтобы этого не произошло используйте bc

bc: float умножение

Также с помощью bc удобно умножать числа с плавающей запятой

Источник

Оцените статью
Adblock
detector