Зайдите по адресу https://bellard.org/jslinux. Запустите командную оболочку Linux.  
К числу основных команд и служебных утилит, используемых при работе в ОС Linux посредством командной оболочки Bash, относятся, приведенные в списке:
- `cat`
- `cd`
- `clear`
- `cp`
- `date`
- `df`
- `du`
- `echo`
- `exit`
- `grep`
- `head`
- `history`
- `info`
- `less`
- `logout`
- `ls`
- `man`
- `mc`
- `mkdir`
- `mv`
- `nano`
- `passwd`
- `ps`
- `pwd`
- `rm`
- `tail`
- `touch`
- `who`
  
**Скрипт-файл** – это обычный текстовый файл, содержащий последовательность команд bash, для которого установлены права на выполнение. Пример скрипта, выводящего содержимое текущего каталога на консоль и в файл:
```bash
#!/bin/bash
dir
dir > 1.txt
```
Любой bash-скрипт должен начинаться со строки:
```bash
#!/bin/bash
```
В этой строке после `#!` указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте, поменяйте её на ваш путь.  
Комментарии начинаются с символа `#` (кроме первой строки).  
Можно создать собственную переменную и присвоить ей значение:
```bash
A=121
A="121"
let A=121
let "A=А+1"
```
Вывод значения на консоль:
```bash
echo $A
```
Пример скрипта с переменными:
```bash
#!/bin/bash
# указываем где у нас хранится bash-интерпретатор
parametr1=$1
# присваиваем переменной parametr1 значение первого параметра скрипта
script_name=$0
# присваиваем переменной script_name значение имени скрипта
echo "Вы запустили скрипт с именем $script_name и параметром $parametr1"
# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной
echo 'Вы запустили скрипт с именем $script_name и параметром $parametr1'
# здесь мы видим другие кавычки. Разница в том, что в одинарных кавычках не происходит подстановки переменных.
exit 0
# выход с кодом 0 (удачное завершение работы скрипта)
```
**Условия:**  
Структура `if-then-else` используется следующим образом:
```bash
if <команда или набор команд, возвращающих код возврата (0 или 1)>
then
	<если выражение после if истинно, то выполняется этот блок>
else
	<если выражение после if ложно, то этот>
fi
```
В качестве команд, возвращающих код возврата, могут выступать структуры `[[ ]]`, `[ ]`, `test`, `(( ))` или любая другая linux-команда.  
- `test` — используется для логического сравнения.  
- `[ ]` — синоним команды test
- `[[ ]]` — расширенная версия `[ ]`, внутри которой могут быть использованы `||` (или), `&` (и)
- `(( ))` — математическое сравнение
  
Для построения многоуровневых условий вида:  
```bash
if ... then ... else if ... then ... else ...  
```
для краткости и читаемости кода, можно использовать структуру  
```bash
if ... then ... elif ... then ... elif ...
```
Если необходимо сравнивать одну переменную с большим количеством возможных значений, то целесообразней использовать оператор `case`.  
```bash
#!/bin/bash
echo "Выберите редатор для запуска:"
echo "1. Запуск программы nano"
echo "2. Запуск программы vi"
echo "3. Запуск программы emacs"
echo "4. Выход"

read doing # читаем в переменную $doing со стандартного ввода

case $doing in
	1) /usr/bin/nano # если $doing содержит 1, то запустить nano
	;;
	2) /usr/bin/vi # если $doing содержит 2, то запустить vi
	;;
	3) /usr/bin/emacs # если $doing содержит 3, то запустить emacs
	;;
	4) exit 0
	;;
	*) #если введено с клавиатуры то, что в case не описывается, выполнять следующее:
	echo "Введено неправильное действие"
esac #окончание оператора case.
```
**Условия сравнения:**
- Файлы:
	- `-e` - Проверить что файл существует (`-f`, `-d`)
	- `-f` - Файл существует (`!-f` - не существует)
	- `-d` - Каталог существует
	- `-s` - Файл существует и не пустой
	- `-r` - Файл существует и доступен на чтение
	- `-w` - Файл существует и доступен на запись
	- `-x` - Файл существует и доступен на выполнение
	- `-h` - Символическая ссылка
- Строки:
	- `-z` - Пустая строка
	- `-n` - Не пустая строка
	- `==` - Равно (`!=` - не равно)
- Числа
	- `-eq` - Равно
	- `-ne` - Не равно
	- `-lt` - Меньше
	- `-le` - Меньше или равно
	- `-gt` - Больше
	- `-ge` - Больше или равно
**Циклы:**  
Оператор `for-in` предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.  
Синтаксис оператора следующий:
```bash
for переменная in список_значений do
	команды
done
```
Пример использования цикла `for`:
```bash
#!/bin/bash
for i in 0 1 2 3 4
# переменной $i будем поочередно присваивать значения от 0 до 4 включительно
do
	echo "Console number is $i" >> /dev/pts/$i
	# Пишем в файл /dev/pts/$i (файл виртуального терминала) строку "Console number is $i"
done
#цикл окончен
exit 0
```
Обход списка файлов в каталоге, используя цикл `for`:
```bash
for f in $HOME/tmp/*; do
	filename=$(basename "$f")
	extension=${filename##*.}
	if [ "$filename" == "stop.txt" ]; then
		break
	fi
	
	if [ $extension != 'png' ]; then continue; fi
	
	echo $f
done
```
**Операции:**  
Команда `let` производит арифметические операции над числами и переменными.  
Рассмотрим небольшой пример, в котором произведем некоторые вычисления над введенными числами:
```bash
#!/bin/bash
echo "Введите a: "
read a
echo "Введите b: "
read b
let "c = a + b" # сложение
echo "a+b= $c"
let "c = a / b" # деление
echo "a/b= $c"
let "c <<= 2" # сдвигает c на 2 разряда влево
echo "c после сдвига на 2 разряда: $c"
let "c = a % b" # находит остаток от деления a на b
echo "$a / $b. остаток: $c "
```
**Функции:**  
Функции в bash могут принимать аргументы, возвращать вычисленное значение и позволяют исключить дублирование кода в скриптах.
```bash
some_sunction() {
	# Объявляем переменную $str локальной и читаем в нее стандартный поток ввода
	local str
	read str
	
	first_argument="$1"
	second_argument="$2"
	
	# Читаем построчно входной поток
	while read line; do
		# Возвращаем список строк для последующей обработки
		echo -n "${first_argument} and $second_argument"
	done <<< file.txt
	
	# Вернуть код завершения (0 - при успешном завершении)
	# Код ответа доступен после выполнения ф-ции в переменной $?
	return 0
}

# Пример вызова функции
echo 'content' | some_sunction arg1 arg2
# или так
some_var='второй аргумент'
result=$(some_sunction 'arg1' "$some_var")
# или так
result=`some_sunction`

ret_code=$? # получить код возврата функции
```
**Потоки:**  
Файл, из которого осуществляется чтение, называется **стандартным потоком ввода**, а в который осуществляется запись — **стандартным потоком вывода**.  
Стандартные потоки:
- 0, `stdin`, ввод
- 1, `stdout`, вывод
- 2, `stderr`, поток ошибок
  
При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:
```bash
command 2>&1               # ошибки (stderr) в stdout
command > ~/out.txt 2>&1   # stdout в файл
command &> ~/out.txt       # весь вывод в файл
```
Для перенаправления потоков используются основные команды: `<`, `>`, `>>`, `<<<`, `|`.  
Рассмотрим, как можно перенаправлять стандартные потоки.  
- Перенаправление потока вывода:
	- `>` - перенаправить поток вывода в файл (файл будет создан или перезаписан)
	- `>>` - дописать поток вывода в конец файла
- Перенаправление потока ввода (прием данных):
	- `<` - файл в поток ввода (файл будет источником данных)
	- `<<<` - чтение данных из строки вместо содержимого файла (для bash 3 и выше)
- Перенаправление вывода ошибок:
	- `2>` - перенаправить поток ошибок в файл
	- `2>>` - дописать ошибки в файл (файл будет создан или перезаписан)
  
**Конвейеры:**  
**Конвейер** - очень мощный инструмент для работы с консолью Bash. Синтаксис `команда1 | команда 2` означает, что вывод команды 1 передастся на ввод команде 2.  
Конвейеры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:
```bash
ls -la | grep "hash" | sort > sortilg_list.txt
```
Вывод команды `ls -la` передается команде `grep`, которая отбирает все строки, в которых встретится слово `hash`, и передает их команде сортировке sort, которая пишет результат в файл `sorting_list.txt`.  
**Задания:**
1. Для каждой из команд, приведенных в списке выяснить её назначение и привести пример (скриншот) работы команды
2. Создать скрипт и выполнить задание (вариант 9): Создайте скрипт, печатающий сводку по указанному каталогу: количество текстовых файлов (`*.txt`), количество исполняемых файлов (установлен атрибут `х`), количество каталогов, и количество всех остальных файлов