MyTetra Share
Делитесь знаниями!
проверка условий bash
Время создания: 31.08.2017 20:51
Текстовые метки: code
Раздел: bash - конструкции
Запись: xintrea/mytetra_db_mcold/master/base/1501677426mgc9t6e30u/text.html на raw.githubusercontent.com

Проверка условий в bash

 

 Written by Fiercemix

 Category: Bash

 Published: 05 March 2014

 Hits: 9722

 Операторы if | then и else.

Операторы if | then проверяют код завершения списка команд на «успешное завершение(истина)» что в свою очередь означает «0», и если это так, то выполняет одну или более команд следующих за словом then. Если проверка возвращает «не успешное завершение (ложь)» что в свою очередь означает «1» выполняется else «иначе» если того требует условие. В завершении условия обязательно закрываем его «fi»!
Все выше написанное возможно будет понятно не сразу, но когда дальше по статье пойдут примеры, все станет на свои места.

Скобки

[ — является специальной встроенной командой test воспринимающей свои аргументы как выражение сравнения или файловую проверку [.....].

[[ — расширенный вариант от «[«, является зарезервированным словом, а не командой, его bash выполняет как один элемент с кодом возврата. Внутри «[[....]]» разрешается выполнение операторов &&, || которые приводят к ошибке в обычных скобках «[....]» тем самым вариант с двойной скобкой более универсален.

(( — является арифметическими выражениями, которое так же возвращают код 0. Тем самым такие выражения могут участвовать в операциях сравнения. 

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

  • строка пуста
  • -z

  • строка не пуста
  • -n

  • строки равны
  • =,(==)

  • строки неравны
  • !=

  • равно
  • -eq

  • неравно
  • -ne

  • меньше
  • -lt,(<)

  • меньше или равно
  • -le,(<=)

  • больше
  • -gt,(>)

  • больше или равно
  • -ge,(>=)

  • отрицание логического выражения
  • !

  • логическое «И»
  • -a,(&&)

  • логическое «ИЛИ»

-o,(||)

Конструкции простой проверки if|then

ifусловие;then
    команды
fi

другими словами

если  проверяемое_выражение_или_команды_верны;  то
   выполняемкоманды
закрываемесли

Пример 1

#!/bin/bash

if echo Тест;then
    echo 0
fi

Часто встречается в скриптах проверка — «существует ли файлы или каталоги» на их примере покажу работу

Пример 2

#!/bin/bash

if[-f $HOME/.bashrc ];then
    echo "Файл существует!"
fi

где

  • $HOME/.bashrc — путь до файла
  • echo — печатает сообщение в консоль


Пример 3

#!/bin/bash

if[[-f $HOME/.bashrc &&-f  /usr/bin/nano ]];then
    echo "Все впорядке, можно редактировать!"
fi


где

  • && — логическое «и», если первый путь «истина» проверяем второй, если он тоже «истина», то выполняем команды (echo)
  • -f — ключ проверки на существования файла (о них чуть ниже)


Конструкции простой проверки if|then|else

ifусловие;then
    команды1
else
    команды2
fi

другими словами

еслипроверяемое_выражение_или_команды_верны;  то
   команды1
иначе
   команды2
закрываемесли


Пример 4

Возможно не лучший пример, нас интересует именно ответ 0 или 1. В результате печатается в консоль «Тест» и «0» потому что команда «echo Тест» успешна и это «истина».

#!/bin/bash

if echo Тест;then
    echo 0
else
    echo 1
fi

Намерено допустите ошибку изменив echo, в результате получите «1» и сообщение о том что «команда eho не существует» и это «ложь».

#!/bin/bash

if eho Тест;then
    echo 0
else
    echo 1
fi

Примеры «существуют ли файл?»

Пример 5

Если файл bashrc существует, то печатает в консоль «Файл существует!», иначе печатает «Файл не существует!»

#!/bin/bash

if[-f "$HOME/.bashrc"];then
    echo "Файл существует!"
else
  echo "Файл не существует!"
fi

Поиграйте с именем проверяемого файла

Пример 6

#!/bin/bash

if[[-f "$HOME/.bashrc"&&-f "/usr/bin/nano"]];then
    echo "Все в порядке, можно редактировать!"
  else
  echo "Ошибка!"
fi

Ключи к файлам и каталогам

[-ключ"путь"]

[-e "путь каталогу_или_файлу"]#- существует ли файл или каталог?
[-r "путь к файлу/каталогу"]#-  доступен ли файл/каталог для чтения?
[-f "путь к файлу/каталогу"]#- существует ли файл?
[-d "путь к каталогу"]#- существует ли каталог?

Полное описание возможных применений различных скобок, правильное разставление кавычек уходит далеко от темы потому могу посоветовать обратится к руководству Advanced Bash Scripting

Арифметика

Пример 7

Если оператор > использовать внутри [[….]], он рассматривается как оператор сравнения строк, а не чисел. Поэтому операторам > и < для сравнения чисел лучше заключить в круглые скобки.

Используем круглые скобки для математического сравнение. Если «3» меньше «6» печатаем «Да».

#!/bin/bash

if((3<6));then
    echo Да
fi

Пример 8

Использование команды test коей является квадратные скобки. Если «3» меньше «6» печатаем «Да».

#!/bin/bash

if[3-lt 6];then
    echo Да
fi

Можно использовать и двойные квадратные скобки, как вы наверно уже поняли это расширенный вариант команды test эквивалентом которой является «[ ]». Если «3» меньше «6» печатаем «Да».

#!/bin/bash
if[[3-lt 6]];then
    echo Да
fi

Пример 9

Используем двойные квадратные скобки, потому что применяем оператор «&&». Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если оно тоже 2=2 (истина), печатаем «Верно»

#!/bin/bash

a="2"
b="2"
if[[2="$a"&&2="$b"]];then
    echo Верно
else
    echo Неверно
fi

Если первое выражение 2 = 2 (истина) тогда выполняем второе, и если переменная «b» не равна двум (лож), печатаем «Не верно»

#!/bin/bash

a="2"
b="3"
if[[2="$a"&&2="$b"]];then
    echo Верно
else
    echo Неверно
fi

Можно конечно сделать проще, нам главное понять принцип if|then и else, не стесняйтесь менять подставляя свои значения.

Вложение нескольких проверок

Bash позволяет вкладывать в блок несколько блоков

#!/bin/bash

if[Условие1];then
  if[Условие2];then
    Команда1
  else
    Команда2
  fi
else
  Команда3
fi

Построения многоярусных конструкций

Для построения многоярусных конструкции, когда необходимо выполнять множество проверок лучше использовать elif — это краткая форма записи конструкции else if.

if[Условие1];then
   Команда1
   Команда2
elif[Условие2];then
   Команда3
   Команда4
else
   Команда5
fi

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования