Litvek - онлайн библиотека >> Автор неизвестен >> Linux и др. >> Bash-скрипты, руководство в 11 частях >> страница 2
переменным, что позволяет использовать эту информацию где угодно в файле сценария.


Сделать это можно двумя способами.


   • С помощью значка обратного апострофа «`»

   • С помощью конструкции $()


Используя первый подход, проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка:


mydir=`pwd`

При втором подходе то же самое записывают так:


mydir=$(pwd)

А скрипт, в итоге, может выглядеть так:


#!/bin/bash

mydir=$(pwd)

echo $mydir

В ходе его работы вывод команды pwd будет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль.


Bash-скрипты, руководство в 11 частях. Иллюстрация № 7

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

Математические операции


Для выполнения математических операций в файле скрипта можно использовать конструкцию вида $((a+b)):


#!/bin/bash

var1=$(( 5 + 5 ))

echo $var1

var2=$(( $var1 * 2 ))

echo $var2


Bash-скрипты, руководство в 11 частях. Иллюстрация № 8

Математические операции в сценарии

Управляющая конструкция if-then


В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит так:


if команда

then

команды

fi

А вот рабочий пример:


#!/bin/bash

if pwd

then

echo "It works"

fi

В данном случае, если выполнение команды pwd завершится успешно, в консоль будет выведен текст «it works».


Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd, и если найти его удалось, сообщить о том, что он существует.


#!/bin/bash

user=likegeeks

if grep $user /etc/passwd

then

echo "The user $user Exists"

fi

Вот что получается после запуска этого скрипта.


Bash-скрипты, руководство в 11 частях. Иллюстрация № 9

Поиск пользователя

Здесь мы воспользовались командой grep для поиска пользователя в файле /etc/passwd. Если команда grep вам незнакома, её описание можно найти здесь.


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

Управляющая конструкция if-then-else


Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else. Вот как она устроена:


if команда

then

команды

else

команды

fi

Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else.


Напишем такой скрипт:


#!/bin/bash

user=anotherUser

if grep $user /etc/passwd

then

echo "The user $user Exists"

else

echo "The user $user doesn’t exist"

fi

Его исполнение пошло по ветке else.


Bash-скрипты, руководство в 11 частях. Иллюстрация № 10

Запуск скрипта с конструкцией if-then-else

Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так:

if команда1

then

команды

elif команда2

then

команды

fi

Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then, иначе, если первое условие окажется ложным, и если вторая команда вернёт ноль, выполнится второй блок кода.


#!/bin/bash

user=anotherUser

if grep $user /etc/passwd

then

echo "The user $user Exists"

elif ls /home

then

echo "The user doesn’t exist but anyway there is a directory under /home"

fi

В подобном скрипте можно, например, создавать нового пользователя с помощью команды useradd, если поиск не дал результатов, или делать ещё что-нибудь полезное.

Сравнение чисел


В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.


n1 -eq n2 Возвращает истинное значение, если n1 равно n2.

n1 -ge n2 Возвращает истинное значение, если n1 больше или равно n2.

n1 -gt n2 Возвращает истинное значение, если n1 больше n2.

n1 -le n2 Возвращает истинное значение, если n1 меньше или равно n2.

n1 -lt n2 Возвращает истинное значение, если n1 меньше n2.

n1 -ne n2 Возвращает истинное значение, если n1 не равно n2.


В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.


#!/bin/bash

val1=6

if [ $val1 -gt 5 ]

then

echo "The test value $value1 is greater than 5"

else

echo "The test value $value1 is not greater than 5"

fi

Вот что выведет эта команда.


Bash-скрипты, руководство в 11 частях. Иллюстрация № 11

Сравнение чисел в скриптах

Значение переменной val1 больше чем 5, в итоге выполняется ветвь then оператора сравнения и в консоль выводится соответствующее сообщение.

Сравнение строк


В сценариях можно сравнивать и строковые значения. Операторы сравнения выглядят довольно просто, однако у операций сравнения строк есть определённые особенности, которых мы коснёмся ниже. Вот список операторов.


str1 = str2 Проверяет строки на равенство, возвращает истину, если строки идентичны.

str1 != str2 Возвращает истину, если строки не идентичны.

str1 < str2 Возвращает истину, если str1 меньше, чем str2.

str1 > str2 Возвращает истину, если str1 больше, чем str2.

-n str1 Возвращает истину, если длина str1 больше нуля.

-z str1 Возвращает истину, если длина str1 равна нулю.


Вот пример сравнения строк в сценарии:


#!/bin/bash

user ="likegeeks"

if [$user = $USER]

then

echo "The user $user  is the current logged in user"

fi

В результате выполнения скрипта получим следующее.


Bash-скрипты, руководство в 11 частях. Иллюстрация № 12

Сравнение строк в скриптах

Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и «<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>» как команду перенаправления вывода.


Вот как работа с этими операторами выглядит в коде:


#!/bin/bash

val1=text

val2="another text"

if [ $val1 \>