Выполнение [домашнего задания](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
```