# Bash

## Арифметические операции

Напишем программу для вычисления суммы двух чисел.

Создадим файл **myscript**

Пишем в файле:

```
#!/bin/bash
a=4
b=12
c=$((a+b))
echo "Summa: $c"
```

Запускаем программу

Пишем в терминале:

```
bash ./myscript
```

## Присваивание

Напишем программу для замены значений двух чисел.

Напишем код:

```
#!/bin/bash
a=12
b=5
echo "A: $a  B: $b"
c=$a
a=$b
b=$c
echo "A: $a  B: $b"
```

## Подстановка команд

Напишем программу для вывода на экран текущей директории.

Пишем код:

```
#!/bin/bash
p=$(pwd)
echo "This folder is: $p"
```

В данном коде в переменную **p** был сохранён результат работы системной функции **pwd**

## Конструкции ветвления

### Сравнение чисел

Напишем программу для сравнения двух целых чисел.

Пишем код:

```
#!/bin/bash
a=8
b=4
if [ $a -gt $b ] 
then
    echo "A bigger B"
elif [ $a -lt $b ] 
then
    echo "A less B"
else
    echo "A equally B"
fi
```

Команды сравнения числовых значений:

1. **n1 -eq n2** Возвращает истинное значение, если n1 равно n2.
2. **n1 -ge n2** Возвращает истинное значение, если n1 больше или равно n2.
3. **n1 -gt n2** Возвращает истинное значение, если n1 больше n2.
4. **n1 -le n2** Возвращает истинное значение, если n1 меньше или равно n2.
5. **n1 -lt n2** Возвращает истинное значение, если n1 меньше n2.
6. **n1 -ne n2** Возвращает истинное значение, если n1 не равно n2.

### Сравнение строк

Напишем программу для сравнения двух строк.

Пишем код:

```
#!/bin/bash
x="xxx xx xx"
y="bbb bb bb"
if [ "$x" \> "$y" ]
then
    echo "$x"
else
    echo "$y"
fi
```

Символы "**>**" и "**<**" необходимо экранировать.

Команды сравнения строк:

1. **str1 = str2** Проверяет строки на равенство, возвращает истину, если строки идентичны.
2. **str1 != str2** Возвращает истину, если строки не идентичны.
3. **str1 < str2** Возвращает истину, если str1 меньше, чем str2.
4. **str1 > str2** Возвращает истину, если str1 больше, чем str2.
5. **-n str1** Возвращает истину, если длина str1 больше нуля.
6. **-z str1** Возвращает истину, если длина str1 равна нулю.

## Циклы

### Цикл For

Напишем программу, которая выводит все числа на определённом отрезке и их общую сумму.

Пишем код:

```
#!/bin/bash
a=5
b=8
s=0
for (( i=$a; i <= $b; i++ ))
do
    echo "Index: $i"
    s=$((s+i))
done
echo "Summa of numbers: $s"
```

### Цикл While

Напишем программу, которая выводит числа на определённом отрезке в обратном порядке.

Пишем код:

```
#!/bin/bash
x=7
z=2
while [ $x -ge $z ]
do
    echo "X: $x"
    x=$((x-1))
done
```

### Вложенные циклы

Напишем программу, которая использует вложенные циклы.

Пишем код:

```
#!/bin/bash
n=3
m=2
for (( i=1; i <= $n; i++))
do
    echo "I: $i"
    for (( j=1; j <= $m; j++))
    do    
        echo "  J: $j"
    done
done
```

### Команда break

Напишем программу, в которой используется команда **break** для выхода из цикла.

Напишем код:

```
#!/bin/bash
a=1
c=0
while [ $a -eq 1 ]
do
    c=$((c+1))
    echo "Hello $c"
    if [ $c -eq 5 ]
    then
        break
    fi
done
```

## Параметры скрипта

Напишем программу, которая принимает в качестве параметров три целых числа.

Данная программа выводит на экран полученные параметры и их общую сумму.

Напишем код:

```
#!/bin/bash
a=$1
b=$2
c=$3
echo "A: $a"
echo "B: $b"
echo "C: $c"
s=$((a+b+c))
echo "Summa: $s"
```

Вызываем скрипт.

Пишем в терминале:

```
bash ./myscript 15 8 12
```

## Ввод с клавиатуры

Напишем программу для расчёта периметра прямоугольника.

Ввод длин сторон осуществляется во время работы программы.

Пишем код:

```
#!/bin/bash
echo -n "Input A: "
read a
echo -n "Input B: "
read b
s=$((a+b))
p=$((s*2))
echo "Perimetr: $p"
```

## Сигналы

При нажатии комбинации клавиш **Ctrl + C** увеличивать значение счётчика.

```
#!/bin/bash

number=0
one=1

incNumber() {
    number=$((number+one)) 
    echo "  Number: $number  "
}

trap "incNumber" SIGINT
while [ $number -eq $number ]
do
    sleep 5
done
```

## Запуск в фоне

Запускаем код серверного приложения в фоне.

```
nohup node index.js &
```

После ввода команды на экране появится PID процесса.

Далее можно закрыть терминал.

Убить процесс:

```
kill 2960
```

## Использование функций

Написать программу для расчёта периметра прямоугольника.

```
#!/bin/bash

getSumma () {
    a=$1
    b=$2
    c=$((a + b))
    echo $(($c))
}

getPerimeter () {
    x=$1
    y=$2
    s=$(getSumma $x $y)
    p=$((s + s))
    echo $(($p))
}

echo -n "Input First: "
read aaa

echo -n "Input Second: "
read bbb

result=$(getPerimeter $aaa $bbb)

echo "Result = $result"
```
