Если вы еще не умеете писать скрипты в системах 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
Делаем файл исполняемым
Чтобы сделать скрипт исполняемым, используйте команду chmod
и убедитесь, что предполагаемые пользователи могут его запустить. Например:
$ chmod 700 scriptname # только вы сможете его запустить $ chmod 755 scriptname # запустить его смогут все
Если скрипт не сделан как исполняемый, его все равно можно запустить с помощью символа .
Это встроенная функция, которая «выполняет» (т. е. читает и запускает) скрипт.
$ . today 08 April 2021
Использование команды 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