Дата:2012-12-17
Продолжаем изучение Bash и в эот раз мы поговорим о
проверкиусловий. Так если Вы помните в материале Изучаем
BASH (Инструкции)
мы говорили о том, что инструкция if-then работает именно с командами,
а не
с условиями и при работе с ними возвращает статус ноль в случае успеха
выполнения команды, однако необходим какой-то способ выполнять проверку
условий в Bash и такой способ разумеется существует.
Ну давайте
сразу перейдем к примеру, а до этого уясним, что существует команда
test, которая обрабатывает условия по сравнению строк, чисел и файлов,
а выглядит она
примерно так:
# vi test1.sh
#!/bin/bash
var1=10
var2=15
if [ $var1
-le $var2 ]
then
echo "10<15"
fi
Ну что же дальше лучше всего привести несколько примеров по работе со сравнениями, а так же указать операторы по сравнению файлов, папок и чисел.
Работа с числами
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 "Файл не текущего пользователя и не одинаковы
группы"
Двойные круглые скобки
Помните операторы работы с числами, когда для сравнения чисел
меньше, больше и т.д. вы вместо знаков использовали -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
Количество просмотров: 13929
Комментарии к статье:
Добавить комментарий