Команда echo в Linux — синтаксис и параметры

Каждый Bash-скрипт стоит начинать со следующих строк:

Как это устроено

  • ! запускает команду bash, а не внутреннюю команду git
  • f() {…}; запускает функцию
  • $(git config ) получит имя вашего редактора из локальной конфигурации или из глобальной, если локальная не задана. К сожалению, он не будет искать в $VISUAL или $EDITOR это, если ничего не установлено.
  • — отделяет команду редактора со списком файлов. Это работает для большинства редакторов командной строки, поэтому безопаснее их вставлять. Если пропущено, а не установлен, то возможно, что исполняемый файл выполняется вместо редактирования. С этим здесь, команда просто потерпит неудачу.
  • [email protected] добавит файлы, введенные в командной строке.
  • f выполнит функцию после того, как она будет определена.

Синтаксис

Рассмотрим синтаксис.

echo [параметры] строка

Основные параметры:

  • -e. Использовать Escape поддержку вывода.
  • -E. Не использовать Escape последовательности вывода.
  • -n. Не переводит результат выполнения команды на новую строку.

Про параметры это все, есть дополнительные аргументы, которые работают при включенной опции Escape последовательности «-e».

Дополнительные аргументы:

  • /c. Убрать перевод строки.
  • /r. Показывает возврат каретки.
  • /b. Удаляет предыдущий символ.
  • /t. Показывает горизонтальную вкладку
  • /v. Выводит вертикальную вкладку.
  • /n. Перевод на новую строку.

Примеры

Для начала выведем на экран слово тест.

echo тест

Часто для настройки маршрутизации трафика в локальную сеть нужно добавить в конец файла ip_forward единицу. Чтобы не открывать этот файл специальными редакторами например nano или vim, воспользуемся эхо и специальным символом «>» перенаправление вывода.

echo 1 > /proc/sys/net/ipv4/ip_forward

Подсчитаем количество байт в слове «линукс», для этого одной директивы эхо не хватит. Нужно воспользоваться дополнительной командой «wc».

Читайте также:  Инструкция по скачиванию APK файлов из Google Play

wc — это утилита, которая считает количество слов или строк в тексте. Она устанавливается по умолчанию в дистрибутивах GNU Линукс.

echo линукс | wc -c

Как видно на скриншоте выше 13 байт. Почему 13? Дело в том что в кодировке utf8  один русский символ занимает 2 байта. В слове линукс шесть букв. Получается 6*2 = 12. Где же еще один байт? 1 байт занимает пустая строка.

Также эхо может выводить на экран значение переменной. Чтобы посмотреть как это работает, объявим переменную linux с помощью «export».

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

export linux=привет

Выводим значение.

echo $linux

Рассмотрим как работает команда с опциями.

Включим интерпретацию специальных последовательностей, параметр «-e» и  переведем каждое слово на новую строку, аргумент «\n».

echo -e «Я \nна \nсайте \nвсе \nпро \nлинукс \nру»

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 баллов в карму.

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

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

Читайте также:  Вышла четвертая бета-версия iOS 14 beta 4

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 # то же самое, но через «сокращённое написание»

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

^ # символ начала строки $ # символ конца строки (не путать с \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 для понимания всего ужаса используемых в реальной жизни регулярок.

Отладка

Проверка синтаксиса (экономит время если скрипт выполняется дольше 15 секунд):

bash -n

Трассировка:

bash -v

Трассировка с раскрытием сложных команд:

bash -x

Параметры -v и -x можно задать в коде, это может быть полезно если ваш скрипт работает на одной машине а журналирование ведется на другой:

set -o verbose set -o xtrace

Признаки того, что вы не должны использовать shell скрипты:

  • Ваш скрипт содержит более нескольких сотен строк.
  • Вам нужны структуры данных сложнее обычных массивов.
  • Вас задолбало заниматься непотребствами с кавычками и экранированием.
  • Вам необходимо обрабатывать/изменять много строковых переменных.
  • У вас нет необходимости вызывать сторонние програмы и нет необходимости в пайпах.
  • Для вас важна скорость/производительность.

Если ваш проект соответствует пунктам из этого списка, рассмотрите для него языки языки Python или Ruby. Ссылки: Advanced Bash-Scripting Guide:  Bash Reference Manual:  Оригинал статьи: