Найти тему
Merion Academy

Учимся писать базовые скрипты в Unix и Linux

Оглавление

👋🏻 Привет! С вами снова Merion Academy - платформа доступного IT образования. Если вы еще не умеете писать скрипты в системах Unix и Linux, эта статья познакомит с основами написания скриптов.

Написание скриптов в системе Unix или Linux может быть одновременно и простым и чрезвычайно сложным. Все зависит от того, что вы пытаетесь выполнить, используя скрипт. В этой статье мы рассмотрим основы создания скриптов - то, как начать, если вы никогда раньше не создавали скрипты.

Идентификация оболочки.

Сегодня в системах Unix и Linux есть несколько оболочек, которые вы можете использовать. Каждая оболочка - это интерпретатор команд. Он считывает команды и отправляет их ядру для обработки.

Bash является одной из самых популярных оболочек, но существуют также zsh, csh, tcsh и korn. Есть даже оболочка под названием fish, которая может быть особенно полезна новичкам в Linux благодаря полезным параметрам автозаполнения команд. Чтобы определить, какую оболочку вы используете, используйте эту команду:

$ echo $SHELL
/bin/bash

Вы также можете определить свою основную оболочку, просмотрев файл /etc/passwd:

$ grep $USER /etc/passwd
nemo:x:1111:1111:Nemo the Fish:/home/nemo:/bin/bash<== /bin/bash

Один из способов определить, какие оболочки доступны в системе Linux, - это проверить файл /etc/shells.

$ more /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/screen
/usr/bin/tmux
/usr/bin/fish

На выводе видно, что доступно всего девять оболочек.

Какую оболочку выбрать пользователю во многом зависит от того, что он привык использовать, поскольку большая часть синтаксиса в скриптах не представляет команды, которые вы найдете в /bin, /us /bin или /usr/local/bin. Вместо этого они являются частью самой оболочки и называются «встроенными». Сюда входят команды, используемые для цикла (например, for и while).

Один из простых вариантов создания скриптов - использовать ту оболочку, которую вы используете в командной строке, поскольку, в конце концов, вам будет более или менее комфортно ее пользоваться.

Выбор оболочки

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

#!/bin/sh
#!/bin/dash
#!/bin/bash
#!/bin/rbash
#!/bin/zsh
#!/usr/bin/zsh
#!/usr/bin/screen
#!/usr/bin/tmux
#!/usr/bin/fish

Когда первая строка вашего скрипта идентифицирует оболочку, которая будет использоваться, эта оболочка будет выполнять команды в скрипте. Если вы не определите оболочку в первой строке в скрипте, то оболочка, которую вы используете при вызове сценария, будет той, которая его запускает.

Выполнение команд

Любую команду, которую вы запускаете в командной строке Linux, можно запустить в скрипте, если он совместим с указанной оболочкой. Используйте свой любимый текстовый редактор и вводите нужные для исполнения команды. Вот очень простой скрипт, который выводит текущую дату в формате день-месяц-год. Скрипт имеет название today.

#!/bin/bash
date +”%d %B %Y”

Чтобы запустить этот скрипт, выполните команду:

$ today
15 April 2021

Добавление комментариев

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

#!/bin/bash
# циклическое отображение даты/времени
while true
do
echo -n “still running ...”
date
sleep 300 # sleep 5 minutes
done

Использование команды if

Команда if позволяет вам проверять условия или переменные. В примере ниже мы проверяем, запускается ли скрипт в пятницу.

if [ date +”%A” == Friday ];then
echo “TGIF!”;
fi

Базовый синтаксис команды if - if value == other_value. Знак == выполняет сравнение, и необходимо убедиться, что оболочка видит по одному значению с каждой стороны оператора сравнения. По этой причине часто приходится заключать свои строки в кавычки.

Понятие переменных

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

$ date=11
$ echo $date
11

Запрос пользователя на ввод данных

Чтобы пользователь, во время исполнения скрипта, смог ввести некоторую информацию, вам необходимо вывести как подсказку, так и команду, чтобы прочитать, что вводит пользователь. Вы также должны присвоить переменной имя, которое имеет смысловое значение, как в этом примере. Обратите внимание, что использование команды echo -n означает, что пользователь вводит свой ответ в той же строке, что и приглашение.

echo -n “Сколько циклов?> “
read numloops

Человек, запускающий сценарий, увидит приглашение и введет ответ :

Сколько циклов? 11

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

Чтобы использовать аргументы, которые пользователь вводит вместе с именем скрипта, необходимо знать, как их идентифицировать. Аргументам скрипта будут присвоены имена $1, $2 и так далее. Для любого аргумента, который вы собираетесь использовать неоднократно, вы можете рассмотреть возможность присвоения этих значений более значимым именам переменных.

$!/bin/bash
if [[ $1 != [0-9]* ]]; then
echo “Ошибка: $1 это не число”
exit
else
loops=$1
fi

В этом случае мы проверяем, является ли первый предоставленный аргумент числовым, и закрываем скрипт, если это не так. Если ответ - число, то далее назначаем его переменной $loops, чтобы использовать позже в скрипте.

Еще одна полезная вещь, которую нужно сделать в скрипте, - это сначала проверить наличие аргументов. В противном случае синтаксис, подобный показанному выше, не сработает, потому что оболочка увидит выражение if [[! = [0-9] *]];, что приведет к синтаксической ошибке.

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

#!/bin/bash
if [ $# -lt 2 ]; then
echo “Usage: $0 lines filename”
exit 1
fi

Различные способы создания циклов

Есть несколько способов сделать цикл внутри скрипта. Используйте for, если вы хотите повторить действие заданное количество раз. Например:

#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done

Или:

#!/bin/bash
for letter in {a..z}
do
echo $letter
done

Используйте while, если хотите выполнять какое-то действие, пока условие существует или не существует.

#!/bin/bash
n=1
while [ $n -le 4 ]
do
echo $n
((n++))
done

Использование оператора case

Операторы case позволяют вашим скриптам реагировать по-разному в зависимости от того, какие значения проверяются. В приведенном ниже скрипте используются разные команды для извлечения содержимого файла, предоставленного в качестве аргумента, путем определения типа файла.

#!/bin/bash
if [ $# -eq 0 ]; then
echo -n “myfile> “
read myfile
else
myfile=$1
fi
if [ ! -f “$myfile” ]; then
echo “Файл не найден: $myfile”
exit
fi
case $myfilein
*.tar) tar xf $myfile;;
*.zip) unzip $myfile;;
*.rar) rar x $myfile;;
*) echo “Нет опций для извлечения $myfile”
esac

Обратите внимание, что этот сценарий также запрашивает имя файла, если оно не было предоставлено, а затем проверяет, действительно ли указанный файл существует. Только после этого выполняется извлечение.

Реакция на ошибки

Вы можете обнаруживать ошибки в скриптах и реагировать на них и тем самым избегать других ошибок. Хитрость заключается в том, чтобы проверять выходные коды после запуска команд. Если код выхода имеет значение, отличное от нуля, произошла ошибка. В этом скрипте проверяется, запущен ли Apache, но отправляем результат проверки в /dev/null. Затем проверяем, не равен ли код выхода нулю, поскольку это означает, что команда ps не получила ответа. Если код выхода не равен нулю, сценарий сообщает пользователю, что Apache не запущен.

#!/bin/bash
ps -ef | grep apache2 > /dev/null
if [ $? != 0 ]; then
echo Apache is not running
exit
fi

--
До встречи на нашей образовательной платформе.
Merion Academy - платформа доступного IT образования.