⚡ ѕ–ќ…ƒ» Ќќ¬џ… ќЌЋј…Ќ  ”–— ѕќ —≈“≈¬џћ “≈’ЌќЋќ√»яћ —ќ — »ƒ ќ… 50%

до конца скидки осталось

Ќачать обучение 🚀
ћерион Ќетворкс

8 минут чтени€

≈сли вы еще не умеете писать скрипты в системах Unix и Linux, эта стать€ познакомит с основами написани€ скриптов.

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

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

ќбучайс€ в Merion Academy

ѕройди курс по
сетевым технологи€м

Ќачать

»дентификаци€ оболочки.

—егодн€ в системах 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

>