# L5. Bash Scripting. Part 1
## Bash scripts
* сценарии командной строки, написанные для оболочки bash
* наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью
* результаты работы команд могут представлять либо самостоятельную ценность, либо служить входными данными для других команд
---
## Syntax
#### Shebang
#!/bin/bash
#### Script Example
```bash=
#!/bin/bash
# This is a comment
pwd whoami
```
---
## Script permissions

```bash=
chmod +x <script>
```

---
## Output
```bash=
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
```

---
## Variables
* Environment
* User
#### Environment
```bash=
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
```
#### User
```bash=
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
```
---
## Command substitution
```bash=
#!/bin/bash
mydir1=`pwd`
echo $mydir1
mydir1=$(pwd)
echo $mydir2
```
---
## Math
$(( a + b ))
```bash=
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2
```
---
## If statement
#### If-then
if command; then
do something
fi
```bash=
#!/bin/bash
user=estroev
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
```
#### If-then-else
if command; then
do something
else
do another thing
fi
```bash=
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
```
#### If-then-elif
if condition1; then
commands
elif condition2; then
commands
fi
```bash=
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi
```
---
## Comparisons
#### Numeric
:::info
n1 -eq n2: Возвращает истинное значение, если n1 равно n2.
n1 -ge n2: Возвращает истинное значение, если n1больше или равно n2.
n1 -gt n2: Возвращает истинное значение, если n1 больше n2.
n1 -le n2: Возвращает истинное значение, если n1меньше или равно n2.
n1 -lt n2: Возвращает истинное значение, если n1 меньше n2.
n1 -ne n2: Возвращает истинное значение, если n1не равно n2.
:::
```bash=
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi
```
#### Strings
:::info
str1 = str2: Проверяет строки на равенство, возвращает истину, если строки идентичны.
str1 != str2: Возвращает истину, если строки не идентичны.
str1 < str2: Возвращает истину, если str1меньше, чем str2.
str1 > str2: Возвращает истину, если str1больше, чем str2.
-n str1: Возвращает истину, если длина str1больше нуля.
-z str1: Возвращает истину, если длина str1равна нулю.
:::
```bash=
#!/bin/bash
user ="estroev"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
```
:::warning
```bash=
#!/bin/bash
val1=text
val2="another text"
if [ $val1 \> "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
```
:::
#### Files
:::info
-d file: Проверяет, существует ли файл, и является ли он директорией.
-e file: Проверяет, существует ли файл.
-f file: Проверяет, существует ли файл, и является ли он файлом.
-r file: Проверяет, существует ли файл, и доступен ли он для чтения.
-s file: Проверяет, существует ли файл, и не является ли он пустым.
-w file: Проверяет, существует ли файл, и доступен ли он для записи.
-x file: Проверяет, существует ли файл, и является ли он исполняемым.
file1 -nt file2: Проверяет, новее ли file1, чем file2.
file1 -ot file2: Проверяет, старше ли file1, чем file2.
-O file: Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.
-G file: Проверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя.
:::
```bash=
#!/bin/bash
mydir=/home/estroev
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi
```