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

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

>

Таким образом, любой последующий код будет выполняться, если хотя бы одно из выражений истинно:


>#!/bin/bash

>x=3

>y=2

>if [ "$x" -eq 5 ] || [ "$y" -eq 2 ]; then

>echo "Одно из условий истинно"

>else

>echo "Ни одно из условий не является истинным"

>fi

Здесь вы видите, что только одно из выражений истинно. Попробуйте изменить значение у и повторно запустите программу. Вы увидите сообщение, что ни одно из выражений не является истинным.

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

>#!/bin/bash

>x=5

>y=10

>if [ "$x" -eq 5 ]; then

>if [ "$y" -eq 10 ]; then

>echo "Оба условия верны"

>else

>echo "Оба условия неверны"

>fi

>fi

Приведенный код менее нагляден для чтения и требует для своего написания больших усилий. Но у вас остается возможность для избавления себя от всех этих трудностей путем использования операторов логических И и ИЛИ.

Использование аргументов

Возможно, вы уже заметили, что большинство программ в Linux не интерактивны. Вы должны указать им какие-то параметры, в противном случае вы получите сообщение со списком возможных аргументов. Возьмем, к примеру, команду more. Если вы не укажете имя файла, она выдаст краткую справку по использованию программы. Ну и конечно же возможно сделать так, чтобы ваши скрипты также могли принимать аргументы. Для этого вам нужно знать что такое переменная вида $#. В ней содержится общее количество аргументов, переданных программе. Например, если вы запустите программу foo следующим образом:

>$ fooпараметр

то значение переменной $# будет равно единице, потому что программе передан только один аргумент. Для двух аргументов ее значение будет равно двум и так далее. Также стоит знать о том, что каждый параметр командной строки (включая даже имя скрипта!!!) может также сохраняться в соответствующие переменные. Так, имя нашей программы foo будет сохранено в переменной $0. Аргумент программы параметр сохранится в переменной $1. Вы можете использовать до 9 переменных, начиная с $0 (обозначающего имя скрипта), а затем $1-$9, обозначающие аргументы программы. Давайте посмотрим, как это работает:

>#!/bin/bash

># скрипт, печатающий свои аргументы

># проверяем, переданы ли скрипту аргументы:

>if [ "$#" -ne 1 ]; then

>echo "корректный запуск программы: $0 <параметр>"

>fi

>echo "Переданный параметр - $1"

Приведенный скрипт ожидает один и только один аргумент для своего запуска. Если вы не укажете ему аргументов — будет выводиться справочная информация. В противном случае, если при запуске указан какой-то аргумент — он передается в наш скрипт, который выведет его на экран. Напоминаю, что $0 это имя скрипта. Именно поэтому эта переменная используется в справочном сообщении. Последняя строка выводит переданный программе параметр — $1.

Работа с временными файлами

Довольно часто вам будет необходимо создавать временные файлы. Обычно это файл, в котором хранятся какие-то используемые скриптом данные либо что-то еще. Как только работа скрипта будет завершена, этот файл нужно удалить. При создании такого файла вы должны задать его имя. Проблема тут кроется в том, что файл, создаваемый вами, не должен случайно переписать уже существующий в той же директории, если их имена совпадут. Для того чтобы создать временный файл с гарантированно уникальным именем, вам нужно использовать символ «$$» символ, либо как префикс, либо как суффикс к имени создаваемого файла. Предположим, вы хотите создать временный файл с именем hello. Возможно, что у пользователя, который работает с нашим скриптом, уже есть файл с таким именем. Создавая файл с именем hello.$$ или $$hello, вы создадите файл с уникальным именем. Например:

>$ touch hello

>$ ls

>hello

>$ touch hello.$$

>$ ls

>hello hello.689

Примерно так и будет выглядеть имя вашего временного файла[16].

Коды завершения программ

Большинство программ возвращают в операционную систему какое-то число, показывающее, насколько удачно программа завершила свою работу. Например, man-страница grep говорит, что grep вернет 0, если заданный шаблон найден, и 1, если совпадений не найдено. Почему нас так волнуют эти коды завершения? По разным причинам. Допустим, мы хотим проверить — есть ли пользователь с данным именем в системе? Один из способов сделать — использовать команду вида: grep имя_пользователя/etc/passwd. Допустим, имя пользователя — vasya:

>$ grep vasya /etc/passwd

>$

Ничего не вывелось. Это означает, что grep не обнаружила заданного пользователя. Но для нас было бы значительно лучше получить сообщение об этом. Это как раз тот случай, когда нужно использовать код завершения программы. Он сохраняется в переменной с именем $?. Посмотрим на следующий фрагмент кода:

>#!/bin/bash

># ищем пользователя vasya в /etc/passwd,

># весь вывод перенаправляем в /dev/null

>grep vasya /etc/passwd > /dev/null 2>&1

># смотрим код завершения и действуем по обстоятельствам:

>if [ "$? -eq 0 ]; then

>echo "Пользователь vasya найден"

>exit

>else

>echo "Пользователь vasya не найден"


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

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


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

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


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

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


Каникулы

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


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

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


Они среди нас

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