notes/start_bash.md

342 lines
6.6 KiB
Markdown
Raw Permalink Normal View History

2022-05-07 22:12:11 +03:00
### Немного 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)
***