Команда test проверяет соответствие некоторому условию. Она принимает следующие формы:
test -e $1
: проверяет, является ли $1 файлом.
test -f $1
: проверяет, является ли $1 обычным файлом, а не файлом устройства, каталогом или исполняемым файлом.
test -d $1
: проверяет, является ли $1 каталогом.
test -x $1
: проверяет, является ли $1 исполняемым файлом. Обратите внимание, что вы также можете проверить другие разрешения. Например, -g проверит,
установлено ли разрешение SGID.
test $1 -nt $2
: проверяет, является ли $1 новее, чем $2.
test $1 -ot $2
: проверяет, старше ли $1, чем $2.
test $1 -eq $2
: проверяет, равны ли числа $1 и $2.
test $1 -ne $2
: проверяет, не равны ли числа $1 и $2.
test $1 -gt $2
: проверяет, является ли число $1 больше числа $2.
test S1 -lt $2
: проверяет, является ли число $1 меньше числа $2.
test $1 -ge $2
: проверяет, является ли число $1 большим или равным числу $2.
test $1 -le $2
: проверяет, является ли число $1 меньшим или равным числу $2.
test -z $1
: проверяет, определена ли переменная $1
test $1
: проверяет, определена ли переменная $1.
test $1=$2
: проверяет, совпадают ли строки $1 и $2. Применяется для сравнения значений двух переменных.
test $1 != $2
: проверяет, не равны ли строки $1 и $2. Также можно использовать ! со всеми другими командами test, а также для проверки отрицания утверждения.
Также для проверки условий можно использовать сокращенную форму, при которой вся команда помещается в квадратные скобки, а слово "test" опускается. Например, вместо test -f $1
пишется
[ -f $1 ]
(обратите внимание на пробелы после открывающей и перед закрывающей скобками).
С помощью специальных операторов && и || можно объединять несколько условий в одно и составлять более сложные, комплексные условия. Они имеют следующий формат:
команда1 && команда2 команда1 || команда2
Если используется &&, то вторая команда выполняется только в том случае, если первая команда выполнена успешно.
Если используется ||, то вторая команда выполняется только в том случае, если первую команду не удалось выполнить. Причем операнды этих операций представляют команды (любые).
Однако нередко в качестве такого выступает условие команды test
Например, с помощью следующего условия можно узнать, является ли $path файлом, и вывести сообщение:
[ -f $path ] && echo $path is a file
Соответственно обратное условие выглядело бы так:
[ -f $path ] || echo $path is not a file
Полный пример
eugene@Eugene:~$ path=~/Documents/hello.txt eugene@Eugene:~$ [ -f $path ] && echo $path is a file /home/eugene/Documents/hello.txt is a file eugene@Eugene:~$ path=~/Documents/ eugene@Eugene:~$ [ -f $path ] && echo $path is a file eugene@Eugene:~$ [ -f $path ] || echo $path is not a file /home/eugene/Documents/ is not a file eugene@Eugene:~$
Операторы && и || также могут объединять простые команды, необязательно условия. Например:
eugene@Eugene:~$ echo "hello" && echo "world" hello world eugene@Eugene:~$
Здесь объединены две команды echo
. Причем действие оператора &&
таково, что вторая команда echo "world"
выполняется, если успешно выполнена первая
Другой пример:
eugene@Eugene:~$ mkdir ~/Documents/test3 && echo "Folder created" Folder created eugene@Eugene:~$
Здесь вторая команда, которая выводит сообщение, выполняется, если успешно создана папка /Documents/test3 в домашнем каталоге пользователя. Но если папку не удастся создать, то вторая команда не выполняется:
eugene@Eugene:~$ mkdir ~/Documents/test3 && echo "Folder created" mkdir: cannot create directory \‘/home/eugene/Documents/test3\’: File exists
В данном случае, поскольку требуемая папка уже ранее была создана, то возникает ошибка, а вторая команда не выполняется
Оператор || выполняет вторую команду, если не удалось выполнить первую. Например:
eugene@Eugene:~$ mkdir ~/Documents/test3 || echo "Unable to create a folder" mkdir: cannot create directory \‘/home/eugene/Documents/test3\’: File exists Unable to create a folder eugene@Eugene:~$
Фактически это предыдущий пример, где опять же не удается создать папку в каталоге root. Но поскольку первая команда завершается неудачей, то выполняется вторая команда, которая выводит соответствующее сообщение.
И также мы могли бы комбинировать оба оператора для создания более сложных условий:
eugene@Eugene:~$ mkdir ~/Documents/test4 && echo "Folder created" || echo "Unable to create a folder" Folder created eugene@Eugene:~$ mkdir ~/Documents/test4 && echo "Folder created" || echo "Unable to create a folder" mkdir: cannot create directory \‘/home/eugene/Documents/test4\’: File exists Unable to create a folder eugene@Eugene:~$
То есть здесь у нас объединяются три команды. Первая команда выполняет создание папки:
mkdir ~/Documents/test4
Если папка была создана успешно, то выполняется вторая команда
echo "Folder created"
Если же при создании папки произошла ошибка, то выполняется третья команда
echo "Unable to create a folder"