Ввод значений пользователем в Bash с помощью команды read

Unix shell является довольно мощным инструментом для разработчиков всех видов. Эта статья призвана дать краткое введение в самые основы, начиная с операционной системы UNIX.

Большинство современных операционных систем, за исключением WINDOWS, построены на базе UNIX. Среди них много дистрибутивов Linux, macOS, iOS, Android и др. Достаточно одного взгляда на схему развития операционных систем, основанных на UNIX, чтобы подчеркнуть важность UNIX, и именно по этой причине она стала широко использоваться на производстве. На самом деле, бэк-энд многих вычислительных систем, включая такие промышленные гиганты, как Facebook и Google, в значительной степени используют UNIX.

Shell

Shell — это интерфейс командной строки для запуска программ на компьютере. Пользователь набирает в строке запроса кучу команд, оболочка запускает программы для пользователя, а затем выводит результат. Команды могут быть либо введены непосредственно пользователем, либо прочитаны из файла, называемого shell-скриптом или shell-программой.

 			Ввод значений пользователем в Bash с помощью команды read

Shell. Какие бывают

UNIX-система обычно предлагает различные типы оболочек shell. Некоторые из них наиболее распространены:

Однако в этой статье мы ограничимся оболочкой Bash. Тем не менее, вам рекомендуется прочитать и попробовать другие оболочки, особенно zsh, так как уже в версии MacOS под названием Catalina zsh заменил оболочку bash. Так что будет хорошей идеей познакомиться с ним сейчас.

Terminal

Терминал — это программа, которая используется для взаимодействия с оболочкой. Это просто интерфейс к оболочке и к другим программам командной строки, которые запускаются внутри нее. Это похоже на то, как веб-браузер является интерфейсом для веб-сайтов. Вот как выглядит типичный терминал в Mac:

 			Ввод значений пользователем в Bash с помощью команды read

У Mac и Linux есть соответствующие версии терминала. Windows также имеет встроенную командную оболочку, но она основана на командной строке MS-DOS, а не на UNIX. Так что давайте посмотрим, как мы можем установить шелл и программу терминала в операционной системе Windows, которая работает так же, как и в системах Mac и Linux.

Установка терминала в WINDOWS

  • Подсистема Windows для Linux (WSL)

Это новая система совместимости с Linux в Windows 10. WSL позволяет разработчикам запускать GNU/Linux окружение — включая большинство инструментов командной строки, утилит и приложений — прямо под Windows, без изменений, без дополнительных виртуальных машин. Подробнее о его установке и функциях вы можете прочитать здесь.

  • Git Bash
 			Ввод значений пользователем в Bash с помощью команды read

Git Bash — это то, что мы будем использовать в этой статье. Скачайте Git на компьютер с Windows отсюда и установите его со всеми настройками по умолчанию. В конце концов, вы получите окно терминала, вроде того, что показано ниже.

Читайте также:  Медиаплеер — гид по выбору и эксплуатации

Изучение терминала

Всякий раз, когда мы открываем окно терминала, мы видим наши последние учетные данные для входа и приглашение Shell. Строка shell появляется всякий раз, когда оболочка готова принять входные данные. Она может немного отличаться в зависимости от дистрибутива, но в основном она отображается как имяпользователя@имякомпьютера, за которым следует знак $.

Если вам не нужна вся эта информация, вы можете использовать PS1 для настройки командной строки.

Теперь терминал будет показывать только $ в строке. Однако это только временно и после перезапуска терминал вернется к своим первоначальным настройкам.

 			Ввод значений пользователем в Bash с помощью команды read

Приступим

Чтобы немного развлечься, давайте начнем с нескольких простых команд:

  • echo: выводит все, что вы набираете в командной строке шелла, аналогично Print на Python.
  • date: отображает текущие время и дату.
  • cal: отображает календарь на текущий месяц.
 			Ввод значений пользователем в Bash с помощью команды read
  • clear: очистит окно терминала, также можно использовать сочетание клавиш Ctrl-L.

Linux, bash. Однострочники

Собственно, начало пары.

|, &&, ||

Уже разбирали. Повторяем.

| — перенаправление вывода одной команды на вход другой. Пример:

man bash | less

|| — ленивое логическое «или». Используется для выполнения операции, если предыдущая завершилась с ошибкой:

cd /root || echo Доступ запрещён

&& — ленивое логическое «и». Используется для выполнения операции, если предыдущая завершилась успешно:

cd $HOME && echo Чуи, мы дома!

cat, head, tail, grep

cat — конкатенация содержимого файлов и вывод:

cat ~/.bash* | less

head — вывести начало файла (по умолчанию 10 строк):

head /etc/passwd

tail — вывести конец файла (по умолчанию 10 строк):

tail /var/log/syslog

— полезно для чтения логов — там как раз последнее — самое интересное. Также часто используется:

tail -f /var/log/syslog

— выводить по мере поступления новых строк в файл.

grep — великая утилита для фильтрации входного потока:

cat /etc/passwd | grep root grep root /etc/passwd # есть вариант указать в аргументах файлы

ДЗ: пишем anti-head-tail — 2 аргумента: с какой по какую строку отправлять на вывод. +5 баллов в карму.

Читайте также:  iPhone 11/X(s/r)/8/7/6 не обновляется iOS по воздуху или через iTunes

xargs

Отдельная заметка про xargs.

Если коротко:

ls | xargs file # передать спиок вывода ls аргументом утилите file.

# Склеить строки echo «a b c» | xargs a b c

regexp

Oh, shi~~

Короче, есть главная проблема программирования — «придумать название переменной».

За ней ровным строем идут регулярные выражения/грамматики, инвалидация кеша и реляционная алгебра.

Я вам не скажу за главную проблему, но за регулярные выражения немного поясню.

Мы уже встречались с прекрасными подстановками типа * и, например, *.txt. Видели забавные mkdir -p ./test/{a,s,d/{q,w,e}}, но что, если я скажу, что подобным образом можно искать?!

Как-то мы уже использовали grep для поиска подстроки в строке:

grep roo /etc/passwd

— ищем «roo» в файле passwd. Но это не так круто, как искать по шаблону!

grep ‘^root:’ /etc/passwd

— находим запись пользователя root.

Отмечу, что в каком-то виде regexp (regular expressions) есть практически во всех языках программирования, поэтому мозголомка ниже будет полезна. Понимание regexp сродни пониманию сложения — рассказывать об этом также сложно, ибо уже не помнишь, в чём проблемы восприятия (поэтому жду вопросов).

Регулярные выражения содержат 3 базовых возможности:

  1. Конкатенация (вспоминаем cat) — два выражения могут идти одно за другим. Полученное большое выражение будет соответствовать входной строке тогда и только тогда, когда часть входа, соответствующая первому маленькому выражению, сразу же следует за частью, которая соответствует второму маленькому выражению.

    ab

  2. Объединение (операция or / ||) — большое выражение соответствует строке, соответствуйщей одному из маленьких выражений, содержащихся в нём.

    a|b

  3. Замыкание — маленькое выражение может быть «повторено» ноль или более раз, чтобы соответствовать входу.

    a*

Примеры регулярных выражений

Конкатенация трёх выражений «f», «oo|ee», «t». Само же выражение «oo|ee» — объединение выражений «oo» и «ee»:

f(oo|ee)t # соответствуют foot или feet

Закрытие/замыкание/кложура и тд:

a+ # соответствует «a» один или более раз a* # соответствует «a» 0 или более раз a? # соответствует «a» 0 или 1 раз a{2,5} # сооветствует от 2 до 5 раз «a» a{2} # 2 раза a{2,} # от 2 раз a{,5} # до 5 раз

Делаем одно и то же разными способами:

a(0|1|2|3|4|5|6|7|8|9) # соотвествует a0, a1 … a9 a[0-9] # то же самое, что и a(0|1|2|3|4|5|6|7|8|9), но используя класс символов a[[:digit:]] # то же самое, что выше, но с альтернативным синтаксисом a\\d # то же самое, но через «сокращённое написание»

Читайте также:  Joom интернет-магазин на русском в рублях

Полезно знать:

^ # символ начала строки $ # символ конца строки (не путать с \n — переводом строки) . # любой символ

Помните [[:digit:]]? Такого много:

[:alnum:] [:cntrl:] [:lower:] [:space:] [:alpha:] [:digit:] [:print:] [:upper:] [:blank:] [:graph:] [:punct:] [:xdigit:]

С чем это едят:

[[ «sad day» =~ (sad|happy) ]] && echo «Что-то о настроении» grep ‘^root:’ /etc/passwd # запись пользователя root awk ‘/false$/ {print $0}’ /etc/passwd # найти всех, кто логинится в false cat /etc/passwd | sed ‘/ *#/d; /^ *$/d’ # убрали комментарии из /etc/passwd и вывели

И это только базовое. Советую читать PCRE для понимания всего ужаса используемых в реальной жизни регулярок.

Ввод значения с клавиатуры, начинающийся с подсказки в Bash с помощью команды read

Для того, чтобы пользователь знал, что требуется ввести, ему нужно дать подсказку в виде текста. Это можно сделать с помощью команды echo, убрав перевод на новую строку с помощью опции \с (можно прочитать по → этой ссылке),но можно все сделать гораздо проще с помощью команды read, используя опцию -p:

[email protected]:~# read -p «Введите имя: » var Введите имя: Виктория [email protected]:~# echo «Было введено имя: » $var Было введено имя: Виктория

Объяснения кажется излишни — вроде должно быть понятно, как работает вывод подсказки в команде read.

Синтаксис описания case

Работа с конструкциями if-else, switch-case в javascript

Оператор case имеет следующую форму:

case EXPRESSION in PATTERN_1) STATEMENTS ;; PATTERN_2) STATEMENTS ;; PATTERN_N) STATEMENTS ;; *) STATEMENTS ;; esac

  • Каждый оператор case начинается с ключевого слова case, за которым следует выражение case и ключевое слово in. Утверждение заканчивается ключевым словом esac.
  • Вы можете использовать несколько шаблонов, разделенных оператором |. Оператор ) завершает список шаблонов.
  • Шаблон может иметь специальные символы.
  • Шаблон и связанные с ним команды называются предложениями.
  • Каждый пункт должен заканчиваться на ;;.
  • Команды, соответствующие первому шаблону, который соответствует выражению, выполняются.
  • Обычной практикой является использование подстановочного знака звездочки ( *) в качестве окончательного шаблона для определения регистра по умолчанию. Этот шаблон всегда будет совпадать.
  • Если не найдено ни одного шаблона, возвращаемый статус равен нулю. В противном случае возвращаемый статус – это статус завершения выполненных команд.