Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/04-script-01-bash/README.md) по теме "4.1. Командная оболочка Bash: Практические навыки". ## Q/A ## Обязательная задача 1 Есть [скрипт](q1_script.sh): ```shell a=1 b=2 c=a+b d=$a+$b e=$(($a+$b)) ``` Какие значения переменным `c`,`d`,`e` будут присвоены? Почему? | Переменная | Значение | Обоснование | |------------|----------|--------------------------------------------------------------------------------------------------------------------------| | `c` | "a+b" | Присвоение обычной строки "a+b" без каких-либо преобразований, так как нет никаких спец-символов. | | `d` | "1+2" | Конкатенация значений переменных `a` и `b` с символом "+", так как не заданы условия для произведения операции сложения. | | `e` | "3" | Сложение значений переменных `a` и `b` используя арифметику целых чисел. | ## Обязательная задача 2 На нашем локальном сервере упал сервис и мы написали скрипт, который постоянно проверяет его доступность, записывая дату проверок до тех пор, пока сервис не станет доступным (после чего скрипт должен завершиться). В скрипте допущена ошибка, из-за которой выполнение не может завершиться, при этом место на Жёстком Диске постоянно уменьшается. Что необходимо сделать, чтобы его исправить: ```shell while ((1==1) do curl https://localhost:4757 if (($? != 0)) then date >> curl.log fi done ``` ### Ваш скрипт: [script](q2_script.sh) ```shell #!/usr/bin/env bash while ((1==1)) do curl https://localhost:4757 if (($? != 0)) then date > curl.log; else break; fi done ``` ## Обязательная задача 3 Необходимо написать скрипт, который проверяет доступность трёх IP: `192.168.0.1`, `173.194.222.113`, `87.250.250.242` по `80` порту и записывает результат в файл `log`. Проверять доступность необходимо пять раз для каждого узла. ### Ваш скрипт: [script](q3_script.sh) ```shell #!/usr/bin/env bash serverPort=80 servers=("192.168.0.1" "173.194.222.113" "87.250.250.242") for i in {1..5} do for server in ${servers[@]} do curl --connect-timeout 3 --max-time 5 http://${server}:${serverPort} curlResult=$? echo "$(date) curl result for ${server} is ${curlResult}" >> curl.log; done done ``` ## Обязательная задача 4 Необходимо дописать скрипт из предыдущего задания так, чтобы он выполнялся до тех пор, пока один из узлов не окажется недоступным. Если любой из узлов недоступен - IP этого узла пишется в файл error, скрипт прерывается. ### Ваш скрипт: [script](q4_script.sh) ```shell #!/usr/bin/env bash serverPort=80 servers=("192.168.0.1" "173.194.222.113" "87.250.250.242") for i in {1..5} do isError=0 for server in ${servers[@]} do curl --connect-timeout 3 --max-time 5 http://${server}:${serverPort} curlResult=$? echo "$(date) curl result for ${server} is ${curlResult}" >> curl.log; if (($curlResult!=0)) then echo ${server} > error.log isError=1 break fi done if (($isError!=0)) then echo "going to break" break fi done ``` ## Дополнительное задание (со звездочкой*) - необязательно к выполнению Мы хотим, чтобы у нас были красивые сообщения для коммитов в репозиторий. Для этого нужно написать локальный хук для git, который будет проверять, что сообщение в коммите содержит код текущего задания в квадратных скобках и количество символов в сообщении не превышает 30. Пример сообщения: \[04-script-01-bash\] сломал хук. ### Ваш скрипт: [script](q5_script.sh) ```shell #!/usr/bin/env bash MSG="$1" if ! grep -qE "^\[.+\]\s.+\n{0,1}$" "$MSG" then cat "$MSG" echo $'\nYour commit message must match the pattern' exit 1 fi msgStr=$(cat $MSG) msgLen=${#msgStr} if ((msgLen>50)) then cat "$MSG" echo $'\nYour commit message is too long' exit 1 fi ``` Протестировал запуск скрипта следующими способами: ```shell # несоответствие паттерну ./q5_script.sh q5_example_bad_pattern.txt # несоответствие длины ./q5_script.sh q5_example_bad_lenght.txt # корректное сообщение ./q5_script.sh q5_example_good.txt ```