Linux bash логические операции

Логические «И», «ИЛИ» и «НЕ»

Любая программа/команда по завершении возвращает так называемый код завершения. Если программа отработала без ошибок, то код завершения будет 0, если с ошибками, то 1. Эти коды 0 и 1 явно не видны, но мы всё равно можем ими пользоваться. В частности, можем использовать логические операторы И и ИЛИ.

Логическое И обозначается &&
Логическое ИЛИ обозначается ||

Предположим, нам нужно запустить программу и если она успешно завершится, выполнить ещё одну. Пример:

ls * && echo "Здесь есть файлы"

В этом примере мы выполняем команду ls * . Т.е. выводим список всех файлов в текущей директории, а в случае успеха (если файлы есть) командой echo выведем сообщение «Здесь есть файлы».

Теперь подробнее:
Если файлы есть, команда «ls *» отработает успешно и вернёт нам код завершения 0, а если файлов нет, то команда не сможет выполнить то, о чём мы её попросили и вернёт код завершения 1.
После этого начнёт выполнятся логический оператор && , который прочтёт код завершения. Если код завершения был 0, то оператор выполнит следующую команду (echo), а если код завершения был не 0, то следующую команду проигнорирует.

Подобным образом работает логический оператор «ИЛИ». Чуть поменяем предыдущий пример:

ls * || echo "Здесь нет файлов"

В этом примере мы выполняем команду ls * и в случае ошибки (если файлов не оказалось) командой echo выведем сообщение «Здесь нет файлов».

Командой wget скачайте файл: https://linux.cttit.ru/files/books/the_lion_the_witch_and_the_wardrob.txt . В случае, если файл скачан успешно выведете сообщение, «файл скачан».

Прочтите скачанный файл командой cat, в конвеере командой grep найдите слово «grass» и если слово найдено, выведите сообщение «Найдено слово grass»

Прочтите скачанный файл командой cat, в конвеере командой grep найдите вхождение «Barak Obama» и если вхождение не найдено, выведите сообщение «Не найдено»

Логическое отрицание, «НЕ»

Логическое отрицание, «НЕ», обозначается восклицательным знаком ! и используется для проверок в операторе test или if.
Например:

[[ -e file.txt ]] && echo "файл существует" [[ ! -e file.txt ]] && echo "файл не существует"

В первом примере, мы проверили существует ли файл, а во втором мы сделали точно такую же проверку, но поставили логическое «НЕ», т.е. сделали проверку «если файл не существует».

Источник

Linux bash логические операции

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

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

var=27 category=minerals # Пробелы до и после оператора "=" -- недопустимы.
# Здесь знак "=" выступает в качестве оператора сравнения if [ "$string1" = "$string2" ] # if [ "X$string1" = "X$string2" ] более отказоустойчивый вариант, # предохраняет от "сваливания" по ошибке в случае, когда одна из переменных пуста. # (добавленные символы "X" компенсируют друг друга.) then command fi
# В Bash, начиная с версии 2.02, был введен оператор возведения в степень -- "**". let "z=5**3" echo "z = $z" # z = 125

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

bash$ echo `expr 5 % 3` 2 

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

Читайте также:  Linux list all uuid

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

#!/bin/bash # gcd.sh: поиск наибольшего общего делителя # по алгоритму Эвклида # Под "наибольшим общим делителем" (нод) двух целых чисел #+ понимается наибольшее целое число, которое делит оба делимых без остатка. # Алгоритм Эвклида выполняет последовательное деление. # В каждом цикле, #+ делимое # последнее $dividend и есть нод. gcd $1 $2 echo; echo "НОД чисел $1 и $2 = $dividend"; echo # Упражнение : # -------- # Вставьте дополнительную проверку входных аргументов, #+ и предусмотрите завершение работы сценария с сообщением об ошибке, если #+ входные аргументы не являются целыми числами. exit 0

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

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

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

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

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

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

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

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

#!/bin/bash # От 1 до 6 пятью различными способами. n=1; echo -n "$n " let "n = $n + 1" # let "n = n + 1" тоже допустимо echo -n "$n " : $((n = $n + 1)) # оператор ":" обязателен, поскольку в противном случае, Bash будет #+ интерпретировать выражение "$((n = $n + 1))" как команду. echo -n "$n " n=$(($n + 1)) echo -n "$n " : $[ n = $n + 1 ] # оператор ":" обязателен, поскольку в противном случае, Bash будет #+ интерпретировать выражение "$[ n = $n + 1 ]" как команду. # Не вызывает ошибки даже если "n" содержит строку. echo -n "$n " n=$[ $n + 1 ] # Не вызывает ошибки даже если "n" содержит строку. #* Старайтесь избегать употребления такой конструкции, #+ поскольку она уже давно устарела и не переносима. echo -n "$n "; echo # Спасибо Stephane Chazelas. exit 0

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

a=2147483646 echo "a = $a" # a = 2147483646 let "a+=1" # Увеличить "a" на 1. echo "a = $a" # a = 2147483647 let "a+=1" # увеличить "a" еще раз, с выходом за границы диапазона. echo "a = $a" # a = -2147483648 # ОШИБКА! (выход за границы диапазона)

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

a=1.5 let "b = $a + 1.3" # Ошибка. # t2.sh: let: b = 1.5 + 1.3: syntax error in expression (error token is ".5 + 1.3") echo "b = $b" # b=1

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

Читайте также:  Установка kali linux через флешку

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

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

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

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

по-битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)

if [ $condition1 ] && [ $condition2 ] # То же самое, что: if [ $condition1 -a $condition2 ] # Возвращает true если оба операнда condition1 и condition2 истинны. if [[ $condition1 && $condition2 ]] # То же верно # Обратите внимание: оператор && не должен использоваться внутри [ . ].
if [ $condition1 ] || [ $condition2 ] # То же самое, что: if [ $condition1 -o $condition2 ] # Возвращает true если хотя бы один из операндов истинен. if [[ $condition1 || $condition2 ]] # Also works. # Обратите внимание: оператор || не должен использоваться внутри [ . ].

Bash производит проверку кода возврата КАЖДОГО из операндов в логических выражениях.

Пример 8-3. Построение сложных условий, использующих && и ||

#!/bin/bash a=24 b=47 if [ "$a" -eq 24 ] && [ "$b" -eq 47 ] then echo "Первая проверка прошла успешно." else echo "Первая проверка не прошла." fi # ОКА: if [ "$a" -eq 24 && "$b" -eq 47 ] # пытается выполнить ' [ "$a" -eq 24 ' # и терпит неудачу наткнувшись на ']'. # # if [[ $a -eq 24 && $b -eq 24 ]] это правильный вариант # (в строке 17 оператор "&&" имеет иной смысл, нежели в строке 6.) # Спасибо Stephane Chazelas. if [ "$a" -eq 98 ] || [ "$b" -eq 47 ] then echo "Вторая проверка прошла успешно." else echo "Вторая проверка не прошла." fi # Опции -a и -o предоставляют #+ альтернативный механизм проверки условий. # Спасибо Patrick Callahan. if [ "$a" -eq 24 -a "$b" -eq 47 ] then echo "Третья проверка прошла успешно." else echo "Третья проверка не прошла." fi if [ "$a" -eq 98 -o "$b" -eq 47 ] then echo "Четвертая проверка прошла успешно." else echo "Четвертая проверка не прошла." fi a=rhino b=crocodile if [ "$a" = rhino ] && [ "$b" = crocodile ] then echo "Пятая проверка прошла успешно." else echo "Пятая проверка не прошла." fi exit 0

Операторы && и || могут использоваться и в арифметических вычислениях.

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

let "t1 = ((5 + 3, 7 - 1, 15 - 4))" echo "t1 = $t1" # t1 = 11 let "t2 = ((a = 9, 15 / 3))" # Выполняется присваивание "a" = 9, #+ а затем вычисляется "t2". echo "t2 = $t2 a = $a" # t2 = 5 a = 9

Источник

Linux bash логические операции

Запись: xintrea/mytetra_db_mcold/master/base/150167745286rzblv9si/text.html на raw.githubusercontent.com

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

Читайте также:  Linux время в utc

Элементарные условные выражения для файлов:

  • -e — файл существует;
  • -f — обычный файл (не каталог и не файл устройства);
  • -s — ненулевой размер файла;
  • -d — файл является каталогом;
  • -b — файл является блочным устройством (floppy, cdrom и т.п.);
  • -c — файл является символьным устройством (клавиатура, модем, звуковая карта и т.п.);
  • -p — файл является каналом;
  • -h — файл является символической ссылкой;
  • -L — файл является символической ссылкой;
  • -S — файл является сокетом;
  • -t — файл связан с терминальным устройством;
  • -r — файл доступен для чтения (пользователю, запустившему сценарий);
  • -w — файл доступен для записи (пользователю, запустившему сценарий);
  • -x — файл доступен для исполнения (пользователю, запустившему сценарий);
  • -g — (sgid) флаг для файла или каталога установлен;
  • -u — (suid) флаг для файла установлен;
  • -k — флаг sticky bit установлен;
  • -O — вы являетесь владельцем файла (пользователь запустивший сценарий);
  • -G — вы принадлежите к той же группе, что и файл (пользователь запустивший сценарий);
  • -N — файл был модифицирован с момента последнего чтения;
  • file1 -nt file2 – file1 более новый, чем file2;
  • file1 -ot file2 – file1 более старый, чем file2;
  • file1 -ef file2 – file1 и file2 являются «жесткими» ссылками на один и тот же файл.

Элементарные условные выражение для сравнения строк:

  • -z str – длина строки str равна 0;
  • -n str – длина строки str не равно 0;
  • str1 == str2 или str1 = str2 – строки совпадают;
  • str1 !== str2 или str1 != str2 – строки не совпадают;
  • str1 < str2 – str1 предшествует str2 в лексикографическом порядке;
  • str1 > str2 – str1 следует за str2 в лексикографическом порядке.

Арифметическое условное выражение имеет формат: arg1 операция arg2, где аргументами являются целые числа, и допустимы следующие операции:

  • -eq – равно;
  • -ne – не равно;
  • -lt – меньше;
  • -le – меньше или равно;
  • -gt – больше;
  • -ge – больше или равно;
  • < — меньше (внутри двойных круглых скобок);
  • > — больше (внутри двойных круглых скобок);
  • >= — больше или равно (внутри двойных круглых скобок);

Команды возвращающие код возврата (звучит странно, но команды нужные):

  • test — используется для логического сравнения (например test -f /home/kyrych/readme вернет истину если readme — обычный файл);
  • [ ] — является специальной встроенной командой воспринимающей свои аргументы как выражение сравнения или файловую проверку [. ]. Вызывает ошибку при попытке использования внутри || (логическое или) и & (логическое и);
  • [[ ]] — расширенная версия «[» (начиная с версии 2.02), внутри которой могут быть использованы || (логическое или), & (логическое и). Должна иметь закрывающую скобку «]]» (является зарезервированным словом, а не командой, его bash выполняет как один элемент с кодом возврата)
  • (( )) — математическое сравнение.

Источник

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