Краткое введение в программирование на 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


Рекомендуем почитать
Горящая рана

Земля давно погибла вместе с солнечной системой, а человечество перебралось на Юплурий, где под куполом появился город. В нем выросло два брата, они стали исследователями и вместе со своей командой изучали планету. Хоктис был немного младше Гинвена, и именно ему было суждено столкнуться с одной из загадок нового дома. Но было ли это загадкой? Было ли это на самом деле? Что не так с Юплурием или с братьями? Может ли сон быть реальностью?


Привет из Чикаго. Перевод с американского на русский и обратно

Жизнь до отъезда в США описана автором в мемурах "Моя наша жизнь". Прожив в США более 20 лет, автор на основании личного опыта сравнивает типичные жизненные ситуации, как они бы выглядели в США и России, особенности поведения, социальные аспекты и общее биополе обеих стран. При этом сравнивается только то, что поддается сравнению, без намерения ставить отметки, где лучше. Все фото – из архива автора.


Вырождение Испанской ветви Габсбургов

Период испанских Габсбургов называют «Золотым веком Испании». В 1700 году со смертью Карла II Околдованного, одного из самых инфантильных, слабых и измученных болезнями императоров, золотой век закончился, пришедшая на его смену изнурительная война за испанское наследство разорила некогда великую империю. Сейчас мы постараемся ответить на следующие вопросы: Кто и почему “околдовал” императора Карла II? К чему приводят кровосмешения в родословной? Как бесплодный, инфантильный наследник престола развязал крупный европейский конфликт начала XVIII века?


Лоухи – Хозяйка Севера, Колдуны на троне, Оренбургский сфинкс и др.

Чудеса, загадки, мистика, феномены и тайны, которые по сей день будоражат человеческое воображение…


Эволюция

Нетипичный сюжет! Вторая книга в трилогии "Единственная для эшра", которая входит в цикл "Эшры и Тени". Её жизнь разделилась на до и после. Арина изменилась — она больше не человек, но и не эшр. Но откуда способности к генерации льда? От чего они появляются и исчезают, когда им вздумается? Сможет ли она найти своё место в этой новой реальности? Тьма сгущается: виновник её кошмара всё ещё не найден, а во снах её уже поджидает новый враг. Кто он? Что ему нужно? Отчего она бежит от него, не в силах сопротивляться навеянному им ужасу.


Песчаный фён. Часть первая

Будущее, в котором наступил долгожданный мир, и человечество покоряет космос. Колонизируются далёкие Марс, Юпитер, Сатурн. Все равны, но все ли довольны? Человечество стремится к далёким звёздам, но понимает ли оно себя? И вот, в один из октябрьских дней, предвидя крупный кризис, американский делегат при Правительственном собрании Земли, предлагает спасительную резолюцию. Казалось, что может пойти не так спустя пять лет? Ничто… Но если вспомнить, чем выложена дорога в ад? Люди забыли своё прошлое полное великих ошибок, ошибок, которые надеялись помнить и не совершать вновь. Автор иллюстрации — Ольга Калинина.