Litvek - онлайн библиотека >> Гарольд Родригес >> Другие языки и системы программирования и др. >> Краткое введение в программирование на Bash >> страница 3
другим. Например, если условный оператор if начинается с if и заканчивается fi. Управляющие операторы — это не отдельные программы в системе, они встроены в bash.

if … else … elif … fi

Это один из наиболее распространенных операторов. Он позволяет программе принимать решения следующим образом — «если условие верно — делаем одно, если нет — делаем что-то другое». Чтобы эффективно его использовать, сначала нужно научиться пользоваться командой test. Эта программа выполняет проверку условия (например, существует ли файл, есть ли необходимые права доступа). Вот переписанный вариант bar.sh:

#!/bin/bash

if test -f /etc/foo

then

# Файл существует, копируем его и печатаем сообщение на экране

cp /etc/foo .

echo "Готово".

else # Файл не существует, поэтому мы печатаем сообщение

# и завершаем работу

echo "Этот файл не существует."

exit

fi


Обратите внимание на отступы строки после then и else. Они не являются обязательными, но зато делают чтение кода гораздо более простым в том смысле, что делают логику программы более наглядной. Теперь запустите программу. Если у вас есть файл /etc/foo — он будет скопирован, в противном случае будет напечатано сообщение об ошибке. Команда test проверяет существование файла. Ключ -f проверяет, является ли аргумент обычным файлом. Ниже приведен список опций test[7]:

Ключи команды test:

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

-e проверяет существование файла

-f проверяет наличие файла и то, что это обычный файл

-g проверяет наличие у файла SGID-бита

-r проверяет наличие файла и то, что он доступен на чтение

-s проверяет наличие файла и то, что его размер больше нуля

-u проверяет наличие у файла SUID-бита

-w проверяет наличие файла и то, что он доступен на запись

-x проверяет наличие файла и наличие у него прав на запуск

Оператор else используется, когда вы хотите, чтобы ваша программа еще что-то делала, если первое условие не выполняется. Существует также оператор elif, который может использоваться вместо еще одного if.elif означает «else if». Он используется, когда первое условие не выполняется, и вы хотите проверить еще одно условие.

Если вам не нравится приведенная форма записи if и test, есть сокращенный вариант.

Например, код:

if test -f /etc/foo

then

Можно записать вот так:

if [ -f /etc/foo ]; then

Квадратные скобки — это еще один вариант записи test. Если у вас есть опыт в программировании на C, этот синтаксис для вас может быть более удобным. Обратите внимание на наличие пробелов до и после каждой из скобок test[8]. Точка с запятой: «;» говорит оболочке о завершении одного оператора и начале следующего. Все, что находится после этого символа будет работать так, как будто он находится на отдельной строке. Это делает код более удобным для чтения и, естественно, что такая запись необязательна. Если вы предпочитаете другой вариант записи —then можно сразу поместить в другой строке.

Если вы используете переменные — их нужно помещать в кавычки. Например:

if [ "$name" -eq 5 ]; then

оператор -eq будет объяснен далее в этой статье.

while … do … done

Оператор while используется для организации циклов. Он работает так «пока (while) условие истинно, делать что-то». Рассмотрим это на примере:

#!/bin/bash

while true; do

echo "Нажмите CTRL-C для выхода."

done

true — это тоже программа. Единственное, что она тут делает — это запускает тело цикла снова и снова. Использование true считается медленным, потому что ваш скрипт должен запускать ее раз за разом. Можно использовать альтернативный вариант:

#!/bin/bash

while :; do

echo "Нажмите CTRL-C для выхода."

done

Это позволяет добиться точно такого же эффекта, но быстрее, потому что «:» — это встроенная функция bash. Единственное отличие состоит в принесении в жертву читабельности кода. Используйте из приведенных вариантов тот, который вам нравится больше. Ниже приведен гораздо более полезный вариант использования переменных:

#!/bin/bash

x=0;

while [ "$x" -le 10 ]; do

echo "Текущее значение х: $х"

# Увеличиваем значение х:

x=$(expr $x + 1)

sleep 1

done

Здесь мы используем для проверки состояния переменной x запись с квадратными скобками. Опция -le означает «меньше или равно (less or equal)». Говоря обычным языком приведенный код говорит: «пока (while) х меньше или равен 10, выводить на экран текущее значение х, после чего добавлять к текущему значению х единицу». Оператор sleep 1 приостанавливает выполнение программы на одну секунду.

Ниже приведен список возможных операций сравнения целых чисел[9]:

x -eq y x = y (equal)

x -ne y x не равен y (not equal)

x -gt y x больше, либо равен y (greater than)

x -lt y x меньше, либо равен y (lesser than)

Операторы сравнения строк:

x = y строка x идентична y

x != y строка х не совпадает y

-n x выражение истинно, если строка х ненулевой длины

-z x выражение истинно, если строка х имеет нулевую длину

Скрипт, приведенный выше, нетрудно понять, за исключением, может быть, только этой строки:

x=$(expr $x + 1)

Комментарий приведенный выше он говорит нам, что он увеличивает х на 1. Но что означает запись$ (...)? Это переменная? Нет. На самом деле это способ сказать оболочке, что вы хотите запустить команду expr $x + 1, и присвоить результат ее выполнения — х. Любая команда, заключенная в $ (…) будет выполняться:

#!/bin/bash

me=$(whoami)

echo "Привет! Меня зовут $me"

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

#!/bin/bash

echo "Привет! Меня зовут $(whoami)"

Вы сами можете выбрать, какая из записей вам ближе и понятнее. Существует и другой способ для выполнения команд или передачи результата их выполнения переменной. Как это сделать — будет объяснено позже. Пока используйте запись вида $(…).

until … do … done

Оператор until применяет способом аналогичным приведенному выше while. Разница лишь в том, что условие работает наоборот. Цикл while выполняет до тех пор пока условие истинно. Цикл until — до тех пор пока условие не станет истинным. Например:

#!/bin/bash

x=0

until [ "$x" -ge 10 ]; do

echo "Текущее значение х равно $ х"

x=$(expr $x + 1)

sleep 1

done

Эта часть кода выглядит знакомой. Попробуйте ее набрать и посмотреть, что он делает. Приведенный цикл будет работать, пока x не станет больше или равен 10. Когда величина x достигнет значения 10, цикл остановится. Таким образом, последнее значение напечатанное значение х будет 9.

for … in … do … done

Цикл for используется, когда вам надо перебрать несколько значений переменной. Например, вы можете написать небольшую программу, которая
Litvek: лучшие книги месяца
Топ книга - Мне все льзя [Татьяна Владимировна Мужицкая] - читаем полностью в LitvekТоп книга - Книга Балтиморов [Жоэль Диккер] - читаем полностью в LitvekТоп книга - Атомные привычки [Джеймс Клир] - читаем полностью в Litvek