### Немного bash

###### top
[args | Позиционные аргументы](#args)  
[var | Переменные](#var)  
[read | запрос ввода](#read)  
[if... then... else](#if)  
[for](#for)  
[&& и ||](#and-or)  
[while](#while)  
[until](#until)  
[case](#case)  

***

##### args
**Позиционные аргументы**  

```bash
#!/bin/bash
# запусти скрипт с несколькими аргументами
echo Первый аргумент - $1
echo Второй аргумент - $2
echo Третий аргумент - $3
```
*примеры запуска скрипта*
```bash
user@host:~$ ./scr arg1 arg2 arg3
Первый аргумент - arg1
Второй аргумент - arg2
Третий аргумент - arg3
user@host:~$ ./scr arg1 arg2
Первый аргумент - arg1
Второй аргумент - arg2
Третий аргумент -
user@host:~$ ./scr arg1 arg2 arg3 arg4
Первый аргумент - arg1
Второй аргумент - arg2
Третий аргумент - arg3
```
**Перебор аргументов в цикле**
```bash
#!/bin/bash
# run this script with a few arguments
echo you have entered $# arguments
for i in "$@"; do
echo $i
done
exit 0
```
`$#` - счетчик, показывающий, сколько аргументов было использовано при запуске сценарий.
`$@` - относится ко всем аргументам, которые использовались при запуске сценария.
*пример запуска скрипта*
```bash
user@host:~$ ./scr arg1 arg2 arg3 arg4
you have entered 4 arguments
arg1
arg2
arg3
arg4
```

[вверх](#top)

***

##### var
Переменные  

`var=value`
```bash
user@host:~$ var="значение переменной"
user@host:~$ echo $var
значение переменной

user@host:~$ var=8
user@host:~$ echo $var
8

user@host:~$ today=$(date +%d.%m.%Y)
user@host:~$ echo $today
03.08.2021

user@host:~$ today=`date +%d.%m.%Y`
user@host:~$ echo $today
03.08.2021
```

[вверх](#top)

***

##### read
Запрос ввода  

```bash
#!/bin/bash
if [ -z $1 ]; then
echo Введите имя
read NAME
else
NAME=$1
fi
echo Вы ввели - $NAME
exit 0
```
`-z $1` - проверка существования аргумента
все возможные значения проверок в справке
`man test`
*перевод доступен здесь https://www.opennet.ru/man.shtml?topic=test&category=1&russian=0*

*пример запуска скрипта*
```bash
user@host:~$ ./scr Катя
Вы ввели - Катя
user@host:~$ ./scr
Введите имя
Ира
Вы ввели - Ира
```

[вверх](#top)

***

##### if
if... then... else  

```bash
#!/bin/bash

# скрипт проверяет тип файла, переданного в качестве аргумента при запуске

if [ -f $1 ]
then
        echo "$1 - это файл"
elif [ -d $1 ]
then
        echo "$1 - это директория"
else
        echo "Не понятно, что это \$1"
fi
exit 0
```
*пример запуска*
```bash
[da2001@co1 scripts]$ ./filechk /etc/hosts
/etc/hosts - это файл
[da2001@co1 scripts]$ ./filechk /etc
/etc - это директория
[da2001@co1 scripts]$ ./filechk ./non_exist_file
Не понятно, что это $1
```

[вверх](#top)

***

##### for

```bash
#!/bin/bash
for i in {0..6}
do
  echo "Hi $i"
done
```

```bash
user@host:~$ ./scr 
Hi 0
Hi 1
Hi 2
Hi 3
```

```bash
#!/bin/bash
for i in Ира Лена Катя
do
  echo "Hi, $i"
done
```

```bash
user@host:~$ ./scr 
Hi, Ира
Hi, Лена
Hi, Катя
```

```bash
#!/bin/bash
for (( c=1; c<=5; c++ ))
do
  echo "Hi $c"
done
```

```bash
user@host:~$ ./scr 
Hi 1
Hi 2
Hi 3
Hi 4
Hi 5
```

```bash
#!/bin/bash
for (( c=4; c>=0; c-- ))
do
  echo "Hi $c"
done
```

```bash
user@host:~$ ./scr 
Hi 4
Hi 3
Hi 2
Hi 1
Hi 0
```

[вверх](#top)

***

##### and, or
&& и ||  

`&&` - логическое И. Вторая часть оператора будет выполнена только если первая часть истинна.  
`||` - логическое ИЛИ. Вторая часть оператора будет выполнена только если первая часть неверна.  

```bash
user@host:~$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done
192.168.1.10 - доступен
192.168.1.11 - доступен
192.168.1.12 - доступен
192.168.1.13 - НЕ доступен
```

[вверх](#top)

***

##### while
`while` - выполнять пока условие истинно

```bash
#!/bin/bash
x=1
while [ $x -lt 5 ]
do
echo "Значение счетчика: $x"
x=$(( $x + 1 ))
done
```

```bash
user@host:~$ ./scr 
Значение счетчика: 1
Значение счетчика: 2
Значение счетчика: 3
Значение счетчика: 4
```

[вверх](#top)

***

##### until
`until` - выполнять пока условие ложно
```bash
#!/bin/bash
count=1
until [ $count -gt 4 ]
do
echo "Значение счетчика: $count"
count=$(( $count + 1 ))
done
```

```bash
user@host:~$ ./scr 
Значение счетчика: 1
Значение счетчика: 2
Значение счетчика: 3
Значение счетчика: 4
```

[вверх](#top)

***

##### case
`case` - перебор условий
```bash
#!/bin/bash

echo -n "Введите страну: "
read COUNTRY

echo -n "Официальный язык в стране $COUNTRY это "

case $COUNTRY in

  Литва)
    echo "Латвийский"
    ;;

  Румыния | Молдова)
    echo "Румынский"
    ;;

  Италия | "Сан Марино" | Швейцария | "Ватикан")
    echo "Итальянский"
    ;;

  *)
    echo "unknown"
    ;;
esac
```
- каждое условие заканчивается `)`
- после условия описываются команды, которые необходимо выполнить, в конце ставится `;;`
- `*)` относится ко всем остальным значениям, которые явно не указаны ранее

```bash
user@host:~$ ./scr
Введите страну: Ватикан
Официальный язык в стране Ватикан это Итальянский
user@host:~$ ./scr
Введите страну: Россия
Официальный язык в стране Россия это unknown
```

[вверх](#top)

***