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

Автор: Admin

Дата:2012-12-17

1) Изучаем BASH (Основы)

2) Изучаем BASH (Инструкции)

Продолжаем изучение Bash и в эот раз мы поговорим о проверкиусловий. Так если Вы помните в материале Изучаем BASH (Инструкции) 
мы говорили о том, что инструкция if-then работает именно с командами, а не с условиями и при работе с ними возвращает статус ноль в случае успеха выполнения команды, однако необходим какой-то способ выполнять проверку условий в Bash и такой способ разумеется существует.
Ну давайте сразу перейдем к примеру, а до этого уясним, что существует команда test, которая обрабатывает условия по сравнению строк, чисел и файлов, а выглядит она примерно так:

# vi test1.sh

#!/bin/bash
var1=10
var2=15
if
[ $var1 -le $var2 ]
then
        echo "10<15"

fi

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

Операторы BASH

Работа с числами

var1 -eq var2

var1 равно var2

-ge

больше или равно

-ne

не равно

-gt

больше

-lt

меньше

-le

меньше или равно

# vi var1.sh

#!/bin/bash
var1=15
if [ $var1 -le 1 ]
then
        echo "Истина"
else
        echo "Ложь"
fi

Работа со строками

str1= str2

st11 равно str2

!=

не равно

<

меньше

>

больше

-n

str1 иммет длину больше 0

-z

str2 имеет длину 0

1) # vi str1.sh

#!/bin/bash
str1=qwert
str2=qwerty
if [ $str1 = $str2 ]
then
        echo "Истина"
else
        echo "Ложь"
fi

2) # vi str2.sh

#!/bin/bash
str1=
if [ -z $str1 ]
then
        echo "Истина"
else
        echo "Ложь"
fi


3) В этом примере показывается как не надо делать сравнение при операторе больше или меньше, так как в данном случае они выполняют перенаправление.

# vi str3.sh

#!/bin/bash
str1=qwert
str2=qweeeeeeeeeee
if [ $str1 > $str2 ]
then
        echo "Истина"
else
        echo "Ложь"
fi


Для правильного сравнения необходимо произвести экранирование оператора.

# vi str4.sh

#!/bin/bash
str1=qwert
str2=qwertwww
if [ $str1 \> $str2 ]
then
        echo "Истина"
else
        echo "Ложь"
fi

Работа с файлами

- d files

проверка на существования файла и на того, что он является каталогом

- e

существует файл или каталог

-f

существет и это файл

-r

существует и стоит атрибут чтения

-s

существует и не пустой

-w

существет и запись

-x

существет и выполение

-O

файл существует и принадлежит текущему пользователю

-G

существует и его группа такая же как у текущего пользователя

files1 -nt files2

более новый чем files2

files1 -ot files2

более старый чем

ПРИМЕР:

# vim files3.sh

#!/bin/bash
cat1=/tmp/cat
# Проверяем существет ли каталог
/tmp/cat
if [ -e $cat1 ]
then
        echo "Каталог $cat1 существует"

  if [ -w $cat1/1234 ]
  then
    echo "Файл существует и Предназначен для записи"
  else
   
  echo "файл не существует - создаем его"
      date > $cat1/1234

  fi
        if [ -O $cat1/1234 ]
          then
          echo "Файл принадлежит текущему пользователю"
          date >> $cat1/1234
          echo "Добавили данные"
        else
           echo "Файл не текущего пользователя"
        fi
else
        echo "Каталог не существует"
fi

Существют еще пара оперторов, которые не заменимы в BASH.

&& - Оператор "И"
||     - Оператор "ИЛИ"

В предыдущий пример достаточно внести не большые изменения и все станет ясно.

if [ -O $cat1/1234 ] && [ -G $cat1/1234 ]
          then
          echo "Файл принадлежит текущему пользователю и имеет одинаковые группы"
           else
           echo "Файл не текущего пользователя и не одинаковы группы"

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

Двойные круглые скобки

Помните операторы работы с числами, когда для сравнения чисел меньше, больше и т.д. вы вместо знаков использовали -ge, -ne и т.д.
При помощи двойных круглых скобок можно производить любое матиматическое выражения как присваивания так и сравнения.

#!/bin/bash
if (( 10 ** 2 > 10 ))
then
   echo "true"
else
        echo "false"
fi


Двойные квадратные скобки

Давайте возьмем какой-либо старый пример и посмотрим разницу:

#!/bin/bash
cat1=/root
if [ -O $cat1/1234 ] && [ -G $cat1/1234 ]
      then
           echo "Файл принадлежит текущему пользователю и имеет одинаковые группы"
      else
           echo "Файл не текущего пользователя и не одинаковы группы"
fi


Альтернативой будет такое выражение:

1)
#!/bin/bash
cat1=/root
if [[ -O $cat1/1234 && -G $cat1/1234 ]]
     then
            echo ""
     else
            echo ""
fi


ЕЩЕ несколько примеров:

2) Если текущий рабочий каталог /tmp И принадлежит той же группе, что и пользователь Тогда создаем файл Если нет тогда переходим в /tmp и создаем файл.

#!/bin/bash
pwdd=/tmp
if [[ $PWD == $pwdd && -G $pwdd ]]
        then
                touch files2
        else
                cd $pwdd
                touch files3
fi

Так же стало возможным производить сопоставление с шаблоном.

4) Если текущий каталог /home/X* где после * все что угодно И текщий пользователь начинается на X, Тогда выполнить команду ls -al

#!/bin/bash
pwdd=/home/XXX
if [[ $PWD = /home/X* && $USER == X* ]]
        then
                ls -al
else
        echo "false"
fi

Далее >>> Циклы в Bash

Количество просмотров: 6771

Комментарии к статье:

Добавить комментарий

Введите сумму с картинки

© Plutonit.ru - Администрирование, настройка Linux и Windows 2009 - 2017