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

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

. В статье также описаны некоторые особенности оболочки Bash.

Если вы все еще возникают проблемы с пониманием того зачем нужно использовать переменные, приведем пример:

>#!/bin/bash

>echo "Значение х - 12".

>echo "У меня есть 12 карандашей".

>echo "Он сказал мне, что значение х равно 12".

>echo "Мне 12 лет."

>echo "Как получилось, что значение х равно 12?"

Хорошо, теперь предположим, что вы решите поменять значение х на 8 вместо 12. Что для этого нужно сделать? Вы должны изменить все строки кода, в которых говорится, что х равно 12. Но погодите… Есть другие строки кода, где упоминается это число, поэтому простую автозамену использовать не получится. Теперь приведем аналогичный пример, только с использованием переменных:

>#!/bin/bash

>x=12 # задаем переменной х значение 12

>echo "Значение х = $х"

>echo "У меня есть 12 карандашей"

>echo "Он сказал мне, что значение х равно $х"

>echo "Мне 12 лет"

>echo "Как получилось, что значение х равно $x?"

Здесь мы видим, что $x выводит текущее значение переменной х равное 12. Поэтому теперь, если вы хотите задать новое значение х равное 8, то все что вам нужно сделать, это изменить одну строчку с х=12 на х=8, и в выводе все строки с упоминанием x также изменяться. Поэтому вам не нужно руками модифицировать остальные строки. Как вы увидите позже, переменные имеют и другие способы применения.

Управляющие операторы

Управляющие операторы делают вашу программу компактнее и позволяют ей принимать решения. И, что еще более важно, они позволяют нам выполнять проверку на наличие ошибок. До сих пор все, что мы сделали, это писали скрипты, которые просто исполняют набор инструкций в файле. Например:

>#!/bin/bash

>cp /etc/foo .

>echo ”Готово”

Это небольшой скрипт, назовем его bar.sh, копирует файл с именем /etc/foo в текущий каталог и выводит «Готово» на экране. Эта программа будет работать при одном условии — файл /etc/foo должен существовать. В противном случае вот что произойдет:

>$./bar.sh

>cp: /etc/foo: No such file or directory

>Готово

Таким образом, как вы видите, есть проблема. Не у каждого, кто будет запускать вашу программу, будет файл/etc/foo. Наверное, было бы лучше, если б ваша программа сначала проверяла наличие данного файла, а затем при положительном ответе — выполняла бы копирование, в противном случае — просто бы завершала работу. В псевдо-коде это выглядит так:

>если /etc/foo существует, то

>скопировать /etc/foo в текущую директорию

>напечатать "Готово" на экране

>в противном случае,

>напечатать на экране "Этот файл не существует"

>выход

Можно ли это сделать в Bash? Конечно! Набор управляющих операторов Bash включает в себя:if, while, until, for и case. Каждый из этих операторов является парным, то есть начинается он одним тегом и заканчивается другим. Например, если условный оператор 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


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

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


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

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


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

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


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

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


Эволюция

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


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

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