Linux bash арифметические операции

Глава 8. Операции и смежные темы

присваивание

Инициализация переменной или изменение ее значения

Универсальный оператор присваивания, пригоден как для сравнения целых чисел, так и для сравнения строк.

Пусть вас не смущает, что оператор присваивания ( «=» ), по своему внешнему виду, совпадает с оператором сравнения (=).

арифметические операторы

возведение в степень

модуль (деление по модулю), возвращает остаток от деления

Этот оператор может применяться в алгоритмах генерации псевдослучайных чисел в заданном диапазоне (см. Пример 9-23 и Пример 9-25), для форматирования вывода на экран (см. Пример 25-10 и Пример A-7), и даже для генерации простых чисел (см. Пример A-18). На удивление часто операцию деления по модулю можно встретить в различных численных алгоритмах.

Пример 8-1. Наибольший общий делитель

«плюс-равно» (увеличивает значение переменной на заданное число)

let «var += 5» значение переменной var будет увеличено на 5.

«минус-равно» (уменьшение значения переменной на заданное число)

«умножить-равно» (умножить значение переменной на заданное число, результат записать в переменную)

let «var *= 4» значение переменной var будет увеличено в 4 раза.

«слэш-равно» (уменьшение значения переменной в заданное число раз)

«процент-равно» (найти остаток от деления значения переменной на заданное число, результат записать в переменную)

Арифметические операторы очень часто используются совместно с командами expr и let.

Пример 8-2. Арифметические операции

Целые числа в Bash фактически являются знаковыми длинными целыми (32-бит), с диапазоном изменений от -2147483648 до 2147483647. Если в результате какой либо операции эти пределы будут превышены, то результат получится ошибочным.

Bash ничего не знает о существовании чисел с плавающей запятой. Такие числа, из-за наличия символа десятичной точки, он воспринимает как строки.

Для работы с числами с плавающей запятой в сценариях можно использовать утилиту-калькулятор bc.

битовые операции. Битовые операции очень редко используются в сценариях командного интерпретатора. Их главное назначение, на мой взгляд, установка и проверка некоторых значений, читаемых из портов ввода-вывода и сокетов. «Битовые операции» гораздо более уместны в компилирующих языках программирования, таких как C и C++.

битовые операции

сдвигает на 1 бит влево (умножение на 2)

let «var var сдвигается влево на 2 бита (умножается на 4)

сдвиг вправо на 1 бит (деление на 2)

«сдвиг-вправо-равно» (имеет смысл обратный )

Источник

Арифметика и bash

Арифметика и bash

Скриптовой язык bash позволяет выполнять арифметические операции. Как вы уже видели в предыдущей статье, арифметика выполняется с помощью команды expr. Однако, подобно команде true, этот вариант считается медленным. Причина кроется в том, что для использования true и expr оболочка должна предварительно запустить их. Лучше всего использовать встроенную в bash функцию, которая работает быстрее. Аналогично тому, что альтернативой true является команда»:», альтернатива expr— заключение арифметического выражения в конструкцию вида$((. )). Будьте внимательны, она отличается от$(. ). Отличие тут в количестве скобок. Так давайте же испробуем это:

x=8 # присваиваем x значение 8

y=4 # присваиваем y значение 4

# результат сложения x и y сохраняем в z:

echo «Сумма $x и $y равна $z»

Как обычно, выбор используемого метода вычислений за вами. Если использование expr для вас более комфортно и привычнее, чем $((. )), используйте его.

Скриптовой язык bash умеет выполнять сложение, вычитание, умножение, целочисленное деление и получение остатка от деления. Каждое арифметическое действие имеет соответствующий ему оператор:

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

x=5 # устанавливаем x равным 5

y=3 # устанавливаем y равным 3

# сохраняем сумму x и y в переменную add

# сохраняем разность x и y в переменную sub

# умножаем x на y и сохраняем результат в переменную mul

# в переменную div сохраняем результат деления x на y

# получаем остаток от деления x на y и сохраняем его в переменную mod

echo «Сумма равна: $add»

echo «Разность равна $sub»

echo «Произведение равно $mul»

echo «Результат деления $div»

echo «Остаток от деления $mod»

Код, приведенный выше, можно было бы написать с использованием expr. Например, вместо add=$(($x + $y)) мы могли бы использовать add=$(expr $x + $y)илиadd=`expr $x + $y`.

Читайте также

64-битовая арифметика

64-битовая арифметика Арифметика 64-битовых указателей файлов не так уж сложна, и для ее реализации в примерах программ используется принятый в Microsoft С 64-битовый тип данных LARGE_INTEGER, объединяющий в одном типе данных union величину типа LONGLONG (носящую название QuadPart) и две

Арифметика

Арифметика gmp_addСложение двух чисел.Синтаксис:recource gmp_add(resource x, recource y)Функция возвратит GMP-число, равное сумме аргументов x и y.gmp_subВычитание двух чисел.Синтаксис:recource gmp_sub(resource x, recource y)Функция возвратит GMP-число, равное разности аргументов x и y.gmp_mulУмножение двух

Установка Bash-2.05a

Установка Bash-2.05a Приблизительное время компиляции: 0.82 SBU Необходимое дисковое пространство: 14 MBИнсталляция BashДля инсталляции Bash выполните:./configure –prefix=/usr –bindir=/bin && make && make install && exec /bin/bash –loginСодержание BashПоследняя проверка: версия 2.05a.Программыbash, sh (ссылка на

Bash Официальная ссылкаBash (2.05a): ftp://ftp.gnu.org/gnu/bash/Содержание BashПоследняя проверка: версия 2.05a.Программыbash, sh (ссылка на bash) и bashbugОписанияbashbash – Bourne-Again SHell, широко используемый в Unix системах командный интерпретатор. Bash считывает данные со стандартного ввода, клавиатуры.

Изменяемые и неизменяемые объекты; адресная арифметика и ссылки

Изменяемые и неизменяемые объекты; адресная арифметика и ссылки Объекты в Питоне бывают двух разновидностей — изменяемые и неизменяемые. Списки, например — объекты изменяемые, их содержимое и длину можно менять. Поскольку ключами словарей могут быть только неизменяемые

Адресная арифметика

Адресная арифметика Аддитивные операции, выполняемые над указателем и целым, имеют осмысленный результат в том случае, если указатель адресует массив памяти, а целое значение представляет смещение в пределах этого массива. Преобразование целого значения к адресному

Глава 34. Bash, версия 2

Глава 34. Bash, версия 2 Текущая версия Bash, та, которая скорее всего установлена в вашей системе, фактически — 2.XX.Y.bash$ echo $BASH_VERSION2.05.8(1)-release В этой версии классического языка сценариев Bash были добавлены переменные-массивы[ 64 ], расширение строк и подстановка параметров,

22.1. Что нужно знать о bash

22.1. Что нужно знать о bash bash — это наиболее часто использующаяся командная оболочка (командный интерпретатор) Linux. Основное предназначение bash — выполнение команд, введенных пользователем. Пользователь вводит команду, bash ищет программу, соответствующую команде, в

22.6. Массивы и bash

22.6. Массивы и bash Интерпретатор bash позволяет использовать массивы. Массивы объявляются подобно переменным. Вот пример объявления массива: ARRAY[0]=1 ARRAY[1]=2 echo

Глава 3 Списки, операторы, арифметика

Глава 3 Списки, операторы, арифметика В этой главе мы будем изучать специальные способы представления списков. Список — один из самых простых и полезных типов структур. Мы рассмотрим также некоторые программы для выполнения типовых операций над списками и, кроме того,

ОКНО ДИАЛОГА: Арифметика по Бутману

ОКНО ДИАЛОГА: Арифметика по Бутману Автор: Владимир ГуриевКомпьютеры Apple и так дешевыми не назовешь, но российским покупателям они особенно дороги. В экстремальных случаях разница в цене такова, что настырный Мак-юзер может слетать из Москвы в нью-йоркский Apple Store и

Источник

Основы BASH. Часть 2

Основы BASH. Часть 2.
Извиняюсь за такую большую задержку между статьями, но сессия дает о себе знать в самый неподходящий момент 🙂
Всем спасибо за замечания, критику и дополнения, которые были озвучены в комментариях к прошлой статье.
Эта часть, как и обещал, будет посвящена циклам, математическим операциям и использованию внешних команд.
Начнем.

Циклы. Цикл for-in.

#!/bin/bash
for i in 0 1 2 3 4 #переменной $i будем поочередно присваивать значения от 0 до 4 включительно
do
echo «Console number is $i» >> /dev/pts/$i #Пишем в файл /dev/pts/$i(файл виртуального терминала) строку «Console number is $i»
done #цикл окончен
exit 0

После выполнения примера в первых 5 виртуальных консолях(терминалах) появится строка с её номером. В переменную $i поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной

Циклы. Цикл while.

#!/bin/bash
again=yes #присваиваем значение «yes» переменной again
while [ «$again» = «yes» ] #Будем выполнять цикл, пока $again будет равно «yes»
do
echo «Please enter a name:»
read name
echo «The name you entered is $name»

echo «Do you wish to continue?»
read again
done
echo «Bye-Bye»

$ ./bash2_primer1.sh
Please enter a name:
ite
The name you entered is ite
Do you wish to continue?
yes
Please enter a name:
mihail
The name you entered is mihail
Do you wish to continue?
no
Bye-Bye

Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.
Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор «[» аналог команды test, которая проверяет истинность условия, которое ей передали.

Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно.
Вот пример:

#!/bin/bash
echo «Введите числитель: »
read dividend
echo «Введите знаменатель: »
read divisor

dnd=$dividend #мы будем изменять переменные dividend и divisor,
#сохраним их знания в других переменных, т.к. они нам
#понадобятся
dvs=$divisor
remainder=1

until [ «$remainder» -eq 0 ]
do
let «remainder = dividend % divisor»
dividend=$divisor
divisor=$remainder
done

echo «НОД чисел $dnd и $dvs = $dividend»

$ ./bash2_primer3.sh
Введите числитель:
100
Введите знаменатель:
90
НОД чисел 100 и 90 = 10

Математические операции

#!/bin/bash
echo «Введите a: »
read a
echo «Введите b: »
read b

let «c = a + b» #сложение
echo «a+b= $c»
let «c = a / b» #деление
echo «a/b= $c»
let «c

$ ./bash2_primer2.sh
Введите a:
123
Введите b:
12
a+b= 135
a/b= 10
c после сдвига на 2 разряда: 40
123 / 12. остаток: 3

Работа с внешними программами при написании shell-скриптов

Перенаправление потоков.

В bash(как и многих других оболочках) есть встроенные файловые дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr).
stdout — Стандартный вывод. Сюда попадает все что выводят программы
stdin — Стандартный ввод. Это все что набирает юзер в консоли
stderr — Стандартный вывод ошибок.
Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), /dev/null

символ «&» означает указатель на дескриптор 1(stdout)
(Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).

2.Конвееры.

ls -la | grep «hash» |sort > sortilg_list

вывод команды ls -la передается команде grep, которая отбирает все строки, в которых встретится слово hash, и передает команде сортировке sort, которая пишет результат в файл sorting_list. Все довольно понятно и просто.

Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.

1. Передача вывода в переменную.

a = `echo «qwerty»`
echo $a

Результат работы: qwerty

LIST=`find /svn/ -type d 2>/dev/null| awk ‘ ‘| sort|uniq | tr ‘\n’ ‘ ‘`
for ONE_OF_LIST in $LIST
do
svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST
done

Здесь мы используем цикл for-do-done для архивирование всех директорий в папке /svn/ с помощью команды svnadmin hotcopy(что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST=`find /svn/ -type d 2>/dev/null| awk ‘ ‘| sort|uniq | tr ‘\n’ ‘ ‘` В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу.

Как видно, все не сложно, достаточно понять принцип и написать пару своих скриптов. В заключении статьи хочу пожелать удачи в изучении BASH и Linux в целом. Критика, как водится приветствуется. Следующая статья возможно будет посвещена использованию таких программ как sed, awk.

Источник

Читайте также:  Как прочесть файл mac os
Оцените статью