Чтение онлайн

на главную

Жанры

Внутреннее устройство Linux
Шрифт:

Существует множество возможностей применять другие команды вместо [. Вот пример, в котором использована команда grep:

#!/bin/sh

if grep -q daemon /etc/passwd; then

echo The daemon user is in the passwd file.

else

echo There is a big problem. daemon is not in the passwd file.

fi

11.5.3. Ключевое слово elif

Ключевое слово elif позволяет вам связать вместе условные операторы if, как показано ниже. Однако не слишком увлекайтесь использованием elif, так как конструкция case, о которой вы узнаете в подразделе 11.5.6, часто оказывается более подходящей.

#!/bin/sh

if [ "$1" = "hi" ]; then

echo 'The first argument was "hi"'

elif [ "$2" = "bye" ]; then

echo 'The second argument was "bye"'

else

echo -n 'The first argument was not "hi" and the second was not "bye"— '

echo They were '"'$1'"' and '"'$2'"'

fi

11.5.4. Логические

конструкции && и ||

Существуют две простые однострочные конструкции, которые могут вам время от времени встречаться: && («и») и || («или»). Конструкция && устроена следующим образом:

command1 && command2

Здесь оболочка запускает команду command1, и если ее код выхода равен 0, оболочка запускает также и команду command2. Конструкция || подобна первой: если команда, расположенная перед символами ||, возвращает ненулевой код выхода, оболочка запускает вторую команду.

Конструкции && и || часто находят себе применение в проверках if, и в обоих случаях код выхода последней запущенной команды определяет то, как оболочка обработает условный оператор. В случае с конструкцией &&, если первая команда завершается неудачно, оболочка использует ее код выхода для инструкции if, но если первая команда завершена успешно, оболочка применяет для условного оператора код выхода второй команды. В случае с конструкцией || оболочка использует код выхода первой команды при ее успешном выполнении или код выхода второй команды, если первая завершила работу неудачно.

Например:

#!/bin/sh

if [ "$1" = hi ] || [ "$1" = bye ]; then

echo 'The first argument was "'$1'"'

fi

Если ваши условные операторы содержат команду проверки ([), как показано здесь, можно использовать символы -a и -o вместо конструкций && и ||, о чем рассказано в следующем разделе.

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

Вы увидели, как работает команда [:, код выхода равен 0, если условие проверки истинно, и не равен 0, если проверка завершена неудачно. Вы знаете также, как проверить равенство строк с помощью команды [ str1 = str2 ]. Помните о том, что сценарии оболочки хорошо приспособлены для операций с целыми файлами, поскольку наиболее полезные проверки с помощью команды [ затрагивают свойства файлов. Например, следующая строка проверяет, является ли файл file обычным файлом (а не каталогом или специальным файлом):

[ -f file ]

В сценариях можно увидеть проверку -f, помещенную в цикл, подобный приведенному ниже. Такой цикл проверяет все элементы, находящиеся в текущем рабочем каталоге (вскоре вы узнаете более подробно о циклах):

for filename in *; do

if [ -f $filename ]; then

ls -l $filename

file $filename

else

echo $filename is not a regular file.

fi

done

Можно выполнить инверсию условия, поместив оператор ! перед аргументами команды проверки. Например, условие [ ! –f file ] возвращает значение true,

если файл file не является обычным файлом. Кроме того, флаги -a и -o являются логическими операторами «и» и «или» (например, [ -f file1 –a file2 ]).

примечание

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

Существуют десятки операторов проверки, и все они попадают в одну из трех основных категорий: проверка файлов, проверка строк и арифметическая проверка. Интерактивное руководство info содержит всю необходимую документацию, однако страница руководства test(1) позволит быстрее навести справки. В следующих разделах приведены общие сведения об основных видах проверок.

Проверка файлов

Большинство проверок файлов, вроде -f, называется унарными операциями, поскольку им необходим только один аргумент: файл, который следует проверить. Вот две важные проверки файлов:

• -e — возвращает значение true, если файл существует;

• -s — возвращает значение true, если файл непyстой.

Многие операции отслеживают тип файла, это значит, что они способны определить, является ли что-либо обычным файлом, каталогом или специальным устройством, как перечислено в табл. 11.1. Есть также несколько унарных операций, которые проверяют права доступа к файлу, как указано в табл. 11.2 (см. также обзор прав доступа в разделе 2.17).

Таблица 11.1. Операторы проверки типа файла

Оператор

Условие проверки

– f

Обычный файл

– d

Каталог

– h

Символическая ссылка

– b

Блочное устройство

– c

Символьное устройство

– p

Именованный канал

– s

Сокет

примечание

Команда test отслеживает символические ссылки (кроме варианта -h), то есть если ссылка link является символической ссылкой на обычный файл, проверка [ -f link ] возвратит код выхода 0 (true).

Таблица 11.2. Операторы проверки прав доступа к файлу

Оператор

Оператор

– r

Для чтения

– w

Для записи

– x

Исполняемый

– u

Setuid

– g

Setgid

– k

«Закрепленный»

Наконец, три бинарных оператора (это проверки, которым необходимы два файла в качестве аргументов) используются при проверке файлов, но такие проверки не слишком распространены. Посмотрите на такую команду, которая содержит оператор -nt («более поздний, чем»):

[ file1– nt file2 ]

Результатом будет значение true, если у файла file1 дата изменения более поздняя по сравнению с файлом file2. Оператор -ot («более ранний, чем») выполняет противоположную проверку. Если же вам необходимо установить идентичность жестких ссылок, оператор -ef позволяет сравнить два файла и выдать результат true, если такие файлы совместно используют одинаковые номера дескрипторов inode и устройства.

Поделиться:
Популярные книги

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

Ведьма и Вожак

Суббота Светлана
Фантастика:
фэнтези
7.88
рейтинг книги
Ведьма и Вожак

Темный Кластер

Кораблев Родион
Другая сторона
Фантастика:
боевая фантастика
5.00
рейтинг книги
Темный Кластер

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Не грози Дубровскому! Том VIII

Панарин Антон
8. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том VIII

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Обыкновенные ведьмы средней полосы

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Обыкновенные ведьмы средней полосы

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Ненастоящий герой. Том 1

N&K@
1. Ненастоящий герой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Ненастоящий герой. Том 1

СД. Том 17

Клеванский Кирилл Сергеевич
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
СД. Том 17

"Фантастика 2023-123". Компиляция. Книги 1-25

Харников Александр Петрович
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Фантастика 2023-123. Компиляция. Книги 1-25