Краткое введение в программирование на Bash - [4]

Шрифт
Интервал

. Точка с запятой: «;» говорит оболочке о завершении одного оператора и начале следующего. Все, что находится после этого символа будет работать так, как будто он находится на отдельной строке. Это делает код более удобным для чтения и, естественно, что такая запись необязательна. Если вы предпочитаете другой вариант записи —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 используется, когда вам надо перебрать несколько значений переменной. Например, вы можете написать небольшую программу, которая печатает 10 точек:

>#!/bin/bash

>echo -n "Проверка системы на наличие ошибок"

>for dots in 1 2 3 4 5 6 7 8 9 10; do

>echo -n "."

>done

>echo "Ошибок не обнаружено"

Опция -n команды echo предотвращает автоматический перевод строки. Попробуйте один раз вариант с -n и вариант без этой опции, чтобы понять, что я имею в виду. Переменная dots последовательно принимает значения от 1 до 10 и одновременно скрипт печатает на экране точку.

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

>#!/bin/bash

>for x in paper pencil pen; do

>echo "значение переменной х равно $х"

>sleep 1

>done

При запуске программы, вы видите, что х сначала имеет значение «pencil», а затем она принимает значение «pen». Когда у переменной заканчивается список возможных значений, цикл завершается.

Ниже приведен гораздо более полезный пример. Этот скрипт добавляет расширение .html для всех файлов в текущей директории[10]:

>#!/bin/bash

>for file in *; do

>echo "Добавляем расширение .html для файла $file ..."

>mv $file $file.html


Рекомендуем почитать
Попаданец для драконши

Я тут попал в другой мир... и знаете, что меня больше всего расстраивает? Тут нет гугла. А как бы было удобно... Эй, гугл, как расколдовать злую королеву если ты - инвалид-колясочник? Эй, гугл, как правильно проводить феминистскую революцию? Эй, гугл, как пользоваться летающим кораблем? Эй, гугл, рыцари какого клана самые лучшие? Но увы... гугла нет. Так что приходится справляться самостоятельно.


Феномен зверя

После ночи, проведённой с незнакомцем, жизнь Эмили круто меняется. Болезненная привязанность и странности окружают девушку со всех сторон и не дают спокойно жить. Тайны затягивают всё глубже, и уже нет возможности вырваться из западни. Кому верить: незнакомцу, после ночи с которым осталось непонятное, практически невозможное побороть притяжение или мужчине, что готов помочь разобраться во всех тайнах и странностях, творящихся в жизни Эмили? Неправильный выбор может стать роковым. Привычный мир рухнет в одночасье, когда раскроются тайны и станут известны истинные мотивы.


Соната лунной принцессы

Соединенные Штаты, Китай, Великобритания, Россия, Европейский Союз. Больше этих некогда влиятельных сверхдержав не найти ни на одной карте мира. Много лет назад само существование жизни на планете было поставлено под угрозу. Города исчезали один за другим, становились историей, а цивилизованный мир таял. Так продолжалось, пока ученые не создали оружие, способное остановить нашествие врагов из параллельной вселенной, прозванных пожирателями. С тех пор на планете уцелели только три города.


Каникулы

Каждая девочка мечтает побыть принцессой, а принцесса мечтает побыть простой девочкой да еще и накануне свадьбы. Тем более, что принцесса наша личность разносторонне развитая, очень любознательная и жизнерадостная. А ее замуж!


Психокинетики-2

Продолжение супергеройского романа «Психокинетики». Враг повержен, но враг — ложный. Теперь героям предстоит разобраться в хитросплетениях глобального заговора, частью которого они стали, и в себе самих. Очередные опасности. Новые способности. И одна угроза на всех.


Они среди нас

Потомки библейских исполинов расселились по земле и живут среди нас. Постепенно, создавая семьи с обычными людьми, они измельчали до человеческих размеров. Борьба полов в семействах исполинов за право властвовать на планете не прекращалась и в двадцать первом веке. В их отношения вмешались силы небесные, пригрозив запустить программу перерождения человека в бесполое существо, способное рождаться на свет с эмбрионом своего единственного будущего ребёнка внутри. Когда и эта угроза не вразумила их, то силы небесные, под предлогом надвигающейся глобальной катастрофы на Земле, решили переселить их на антиземлю — планету Антихтон, движущуюся по одной орбите с Землёй, по другую сторону Солнца.