Инициализация переменной или изменение ее значения
Универсальный оператор присваивания, пригоден как для сравнения целых чисел, так и для сравнения строк.
Пусть вас не смущает, что оператор присваивания ( «=» ), по своему внешнему виду, совпадает с оператором сравнения (=).
арифметические операторы
возведение в степень
модуль (деление по модулю), возвращает остаток от деления
Этот оператор может применяться в алгоритмах генерации псевдослучайных чисел в заданном диапазоне (см. Пример 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. Часть 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, только выполняется пока какое-то выражение ложно. Вот пример:
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.
Источник
Сложение, вычитание, умножение, деление, модуль в Bash
В зависимости от того, какой тип работы вы хотите, чтобы ваши сценарии выполнялись, вы можете в конечном итоге использовать арифметику много или не много. Однако разумная уверенность в том, что вам нужно будет использовать арифметику в какой-то момент. Подобно переменным, их разумно легко реализовать, и знание того, как это сделать, является важным навыком мастерства мастеров Bash.
Существует несколько способов арифметики в сценариях Bash. Мы рассмотрим их для полноты, но рекомендуемый подход — это арифметическое расширение (последнее охватывает).
Let это встроенная функция Bash, которая позволяет нам выполнять простую арифметику. Он следует основному формату:
Арифметическое выражение может принимать различные форматы, которые мы опишем ниже. Первая часть, как правило, всегда является переменной, которая сохраняется в результате.
Давайте рассмотрим простой пример:
let_example.sh
Давайте разберем это:
Строка 4 — это основной формат. Обратите внимание, что если мы не ставим кавычки вокруг выражения, тогда оно должно быть записано без пробелов.
Строка 7 — На этот раз мы использовали кавычки, которые позволяют нам выделять выражение, чтобы сделать его более читаемым.
Строка 10 — это сокращение для приращения значения переменной a на 1. Это то же самое, что и запись «a = a + 1».
Строка 16 — Мы можем также включить в выражение другие переменные.
Вот таблица с некоторыми из основных выражений, которые вы можете выполнить. Есть и другие, но они наиболее часто используются.
оператор
операция
+, -, / *, /
Сложение, вычитание, умножение, деление
var ++
Увеличьте переменную var на 1
var—
Уменьшить переменную var на 1
%
Модуль (возвращает остаток после деления)
Эти операторы могут использоваться и в других механизмах, описанных ниже.
Expr похож на let, но вместо сохранения результата на переменную вместо этого выводит ответ. В отличие от let вам не нужно заключать выражение в кавычки. Вы также должны иметь пробелы между элементами выражения. Также часто используется выражение expr в подстановке команд для сохранения вывода в переменную.
Давайте рассмотрим простой пример:
expr_example.sh
Давайте разберем это:
Строка 4 — это основной формат. Обратите внимание, что между элементами и пробелами нет пробелов.
Строка 6 — Если мы помещаем кавычки вокруг выражения, выражение не будет оцениваться, а печататься.
Строка 8 — Если мы не помещаем пробелы между элементами выражения, выражение не будет оцениваться, а печататься.
Строка 10 — Некоторые символы имеют особое значение для Bash, поэтому мы должны избегать их (поставить обратную косую черту перед), чтобы удалить их особое значение.
Строка 12 — Здесь мы покажем модуль оператора . Модуль — это остаток, когда первый элемент делится на второй элемент.
Строка 14 — На этот раз мы используем expr в подстановке команд, чтобы сохранить результат в переменной a.
Двойные скобки
В разделе «Переменные» мы увидели, что мы можем легко сохранить вывод команды в переменной. Оказывается, этот механизм также может сделать базовую арифметику для нас, если мы немного подберем синтаксис. Мы делаем это, используя двойные скобки:
Вот пример для иллюстрации:
expansion_example.sh
Давайте разберем это:
Строка 4 — это основной формат. Как вы можете видеть, мы можем использовать его для удобства чтения без необходимости использования котировок.
Строка 7 — Как вы можете видеть, она работает так же, если мы выберем интервал.
Строка 10 — Мы можем включать переменные без предшествующего знака $.
Строка 13 — Переменные могут быть включены в знак $, если вы предпочитаете.
Строка 16 — Это немного другая форма. Здесь значение переменной b увеличивается на 1 (используя тот же механизм, что и в случае let ). Когда мы это делаем, нам не нужен знак $, предшествующий скобкам.
Строка 19 — Это немного другая форма предыдущего примера. Здесь значение переменной b увеличивается на 3. Это сокращение для b = b + 3 .
Строка 19 — В отличие от других методов, когда мы делаем умножение, нам не нужно выходить из знака * .
Таким образом, вы можете видеть, что double parenthese достаточно гибко в том, как вы форматируете его выражение. Это часть того, почему мы предпочитаем этот метод. Поскольку двойные круглые скобки встроены в Bash, он также работает более эффективно (хотя, честно говоря, с сырой вычислительной мощью машин в наши дни разница в производительности действительно несущественна).
Длина переменной
Это не арифметика, но она может быть весьма полезна. Если вы хотите узнать длину переменной (сколько символов), вы можете сделать следующее: