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


Рекомендуем почитать
Звёздные Войны и Библия: Пустыни

Рассмотрение пустынь вселенной "Звёздные Войны" и связанных с ними сюжетов, в качестве отсылок к мотиву Библейских событий в Иудейской, Иорданской и Синайской пустынях.


Я, Мишка и «маятник скорости». Фантастический рассказ

Думаю, многие из вас хотели бы полететь в космос. А отправиться к звездам мечтали все в подростковом возрасте. Вот и два друга после нескольких испытаний прибора "маятник скорости" попали в параллельные миры. А что этому предшествовало и что оказалось явью, Вы прочтете на страницах этого увлекательного рассказа.


Когда проснется Харон

Коммерческий транспорт "Олимп" выходит из прыжка в системе бозонной звезды. Людям предстоит колонизировать новую планету. Помочь в этом призван Харон, готовый принести себя в жертву и превратиться в одно из составляющих экзотической системы.


Следы неведомой цивилизации

Недалекое будущее. Человечество осваивает космос и активно создает колонии на пригодных планетах. На одной из планет колонисты находят вырезанные на камнях орнаменты. Для изучения петроглифов с Земли прибывает научная экспедиция, что найдут они изучая странные символы на скальных стенах далекой планеты?


Космолет

Как связан унылый, да еще подвальный офис на месте бывшего ресторана "Космос" с трансгалактическим лайнером? И почему замотавшийся и, честно говоря, довольно бесхребетный Начальник иногда ощущает себя Капитаном? Возможно, мы не все знаем не только о себе самих, но и о своей работе…


Лунная Олимпиада

Олимпиада – всегда адреналин. А если поднять ставки до эпического уровня? Дамы и господа, добро пожаловать на первые в истории человечества Лунные Игры! Это не просто соревнования – в прямом эфире телеканала "Всемогущий" разворачивается древнегреческая драма… Или все-таки комедия?