Bash-скрипты, часть 4: ввод и вывод

Экранирование символов

Различные специальные символы воспринимаются как управляющие символы, а не как часть строки. Например, символ пробела разделяет аргументы, знак доллара ($) используется при развертывании подстановок, перенос строки указывает конец команды.

Чтобы использовать специальные символы, их можно экранировать специальным символом «\» (обратная косая черта).

1
2
3
4
5
6

 
test]$ echo Stroka\ \ \ s probleami\
> perenosom stroki i summoi pokupki \$100.
Stroka   s probleamiperenosom stroki i summoi pokupki $100.
test]$
 

В этот раз в строке все наши пробелы и остались, а символ валюты не был воспринят развертывание переменной. При вводе команды в конце первой строки (перед нажатием Enter) мы поставили символ экранирования, поэтому Linux Shell не стал исполнять команду сразу, а предложил ее продолжить на второй строке. Это очень удобно при написании длинных инструкций (например, команда с множеством аргументов). Мы можем разбить строку на несколько в нужных нам местах, что сделает команду читаемой. В основном данный прием используется при написании Shell скриптов

Очень важно сделать его читаемым и понятным, чтобы в будущем не тратить время пытаясь вспомнить, что мы написали

Но как же быть с развертыванием? Например, если мы желаем, чтобы результат развертывания был воспринят единым аргументом? И для этого есть простое решение

$ — выражения переменных

В оболочке Bash вы создаете переменные для хранения значений. Некоторые, такие как переменные среды, существуют всегда, и вы можете получить к ним доступ в любое время, когда открываете окно терминала. Они содержат значения, такие как ваше имя пользователя, домашний каталог и путь.

Вы можете использовать, echo, чтобы увидеть значение, которое содержит переменная, — просто перед именем переменной следует знак доллара ($), как показано ниже:

echo $ USER
echo $ HOME
echo $ PATH

Чтобы создать переменную, вы должны дать ей имя и указать значение для ее хранения. Вам не нужно использовать знак доллара для создания переменной. Вы добавляете только $, когда ссылаетесь на переменную, например, в следующем примере:

ThisDistro=Ubuntu
MyNumber=2001
echo $ThisDistro
echo $MyNumber

Добавьте фигурные скобки ({}) вокруг знака доллара и выполните расширение параметра, чтобы получить значение переменной и разрешить дальнейшие преобразования значения.

Это создает переменную, которая содержит строку символов, как показано ниже:

MyString = 123456qwerty

Используйте следующую команду для вывода строки в окно терминала:

echo $ {MyString}

Чтобы вернуть подстроку, начиная с позиции 6 всей строки, используйте следующую команду (смещение нуля, поэтому первая позиция равна нулю):

echo $ {myString: 6}

Если вы хотите отобразить подстроку, которая начинается с нулевой позиции и содержит следующие шесть символов, используйте следующую команду:

echo $ {myString: 0: 6}

Используйте следующую команду, чтобы отобразить подстроку, которая начинается с четвертой позиции и содержит следующие четыре символа:

echo $ {myString: 4: 4}

cat

Команда cat выводит содержание файлов в окне терминала.

cat позволяет:

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

Синтаксис команды cat:

Чтобы посмотреть содержимое файла .bash_log_out через терминал нужно ввести:

Чтобы склеить несколько файлов с помощью команды cat нужно просто указать названия файлов в аргументах, а результаты записать в новый файл. Например:

Основные опции cat:

  • -b — нумеровать только строки с содержимым;
  • -E — выводить $ в конец каждой строки;
  • -n — нумеровать все строки;
  • -s – удалять повторы пустых строк;
  • -T — выводить табуляции в виде ^I.

Подстановка команд

Мы уже знаем как перенаправить вывод команды в файл или прицепить к вводу другой команды. А еще его можно подставить в строку и передавать как аргументы другой команды. Для развертывания вывода команды, саму команду необходимо обернуть в круглые скобки и поставить перед ними символ “$” (знак доллара). Посмотрим как это работает.

1
2
3
4
5
6
7
8
9
10

 
test]$ ls
bin.txt  test1.txt  test3300.txt  usr-sorted.txt
photo    test2.txt  test.txt      usr.txt
test]$ echo $(ls)
bin.txt photo test1.txt test2.txt test3300.txt test.txt usr-sorted.txt usr.txt
test]$ echo SPISOK:  $(ls)
SPISOK: bin.txt photo test1.txt test2.txt test3300.txt test.txt usr-sorted.txt usr.txt
test]$
 

Вместо знака доллара и скобок можно использовать символ «`» (обратная кавычка).

1
2
3
4
5
6
7
8
9

 
test]$ echo SPISOK:  $(ls)
SPISOK: bin.txt photo test1.txt test2.txt test3300.txt test.txt usr-sorted.txt usr.txt
test]$ echo `ls`
bin.txt photo test1.txt test2.txt test3300.txt test.txt usr-sorted.txt usr.txt
test]$ echo SPISOK:  `ls`
SPISOK: bin.txt photo test1.txt test2.txt test3300.txt test.txt usr-sorted.txt usr.txt
test]$
 

curl

Утилита curl извлекает информацию и файлы с url-страниц.

Будет полезна тем, кто часто загружает:

  • Скрипты.
  • Исполняемые файлы программ.
  • Архивы.

С помощью команды curl это можно делать не через браузер, а прямо из терминала, что дает возможность автоматизировать процесс.

На самом деле curl является не просто утилитой, а целым набором библиотек, способными реализовать все основные возможности по работе c передачей файлов и url-страницами.

Curl поддерживает работу с протоколами:

  • FTP
  • FTPS
  • HTTP
  • HTTPS
  • TFTP
  • SCP
  • SFTP
  • Telnet
  • DICT
  • LDAP
  • POP3
  • IMAP
  • SMTP

Загрузка файлов с помощью curl

Самая распространенная задача для утилиты curl – это загрузка файлов. Чтобы скачать файл достаточно передать утилите имя файла или адрес страницы, например:

Таким образом содержимое файла будет отправлено на стандартный вывод. Для записи его в файл (для примера ex.txt) нужно ввести:

Чтобы скачанный файл назывался так же, как и на сервере необходимо использовать опцию -O:

Стоит отметить, что не во всех дистрибутивах Linux утилита предустановлена по умолчанию.

! — логический оператор НЕ и оператор истории

Восклицательный знак (!) — это логический оператор, который означает НЕ.

В этой командной строке есть две команды:

[! -d ./backup] && mkdir ./backup
  • Первая команда — это текст в квадратных скобках;
  • Вторая команда — это текст, который следует за двойными амперсандами &&.

Первая команда использует ! в качестве логического оператора. Квадратные скобки указывают на то, что будет проведено испытание. Опция  -d (directory) проверяет наличие каталога с именем backup. Вторая команда создает каталог.

Поскольку двойные амперсанды разделяют две команды, Bash выполнит вторую только в случае успеха первой  . Однако это противоположность того, что нам нужно. Если проверка для «резервной» директории прошла успешно, нам не нужно её создавать. И если проверка для каталога «backup» не пройдена, вторая команда не будет выполнена, а отсутствующий каталог не будет создан.

Это где логический оператор ! входит. Он действует как логическое НЕ. Таким образом, если тест пройден успешно (т.е каталог существует), он ! переходит на «НЕ успешно», что является ошибкой. Итак, вторая команда не активирована.

Если проверка каталога не пройдена (т.е каталог не существует), ! ответ изменяется на «НЕ сбой», что является успехом . Таким образом, команда для создания недостающего каталога будет выполнена.

Чтобы проверить состояние папки резервной копии, вы используете ls команду и параметры -l (длинный список) и -d (каталог), как показано ниже:

ls -l -d backup

Вы также можете запускать команды из истории команд с восклицательным знаком. Команда history выводит список вашей истории команд, а затем Вы набираете номер команды, с которой хотите выполнить ее повторно !, как показано ниже:

!24

Следующая команда повторно запускает предыдущую команду:

!!

chown

Команда chown (change owner) позволяет менять владельца и группу владельца:

  • Файлов.
  • Каталогов.
  • Ссылок.

Основные опции команды chown:

  • -c — детальный вывод всех выполняемых изменений;
  • -f — минимум информации (убирает ошибки из выдачи);
  • -h — изменять права символических ссылок, а файлы к которым они ведут не трогать;
  • -R — рекурсивная обработка всех подкаталогов;
  • -L — переходить по всем символическим ссылкам на директории.

Изменить владельца папки ex1 на user:

Изменить на владельца user и группу users:

Чтобы изменения применялись не только к данному каталогу, но и всем подкаталогам внутри, необходимо добавить опцию -R:

Как создавать папки и файлы

В Linux создавать файлы и папки довольно просто. Начнем с создания нового каталога под названием «Пончики». Вы будете использовать команду:

Чтобы проверить, был ли создан каталог, используйте ls.

Вы также можете создать несколько каталогов mkdir, используя:

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

Вы можете создавать подкаталоги внутри каталога, добавляя —p. Допустим, вы хотите создать Donuts2в Donuts1ин Donuts, вы должны использовать:

Чтобы просмотреть структуру каталогов, используйте:

Теперь, когда у нас много каталогов, давайте создадим несколько файлов. В Linux есть много методов для создания файлов, некоторые из них включают:

  • Сенсорная команда
  • Оператор перенаправления
  • Команда кота
  • Команда echo

Арифметические операции

Linux Shell при развертывании вычисляет значения арифметических выражений. Командную строку можно использовать как калькулятор

Чтобы значение было вычислено, арифметическое выражение необходимо обернуть в двойные круглые скобки и поставить перед ними символ «$» (знак доллара).

1
2
3
4
5

 
test]$ echo $((2+2))
4
test]$
 

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

1
2
3
4
5

 
test]$ echo $(($((5**2)) * 3))
75
test]$
 

В данном примере во вложенным арифметическом выражении число 5 возводится в квадрат (2 степень), затем результат умножается на 3.

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

1
2
3
4
5

 
test]$ echo $(((5**2) * 3))
75
test]$
 

Возможно также целочисленное деление чисел и извлечение остатка. Попробуем разделить 5 жестких дисков на два компьютера, так чтобы каждый получил поровну.

1
2
3
4
5

 
test]$ echo Rezultat $((5/2)), ostatok $((5%2))
Rezultat 2, ostatok 1
test]$
 

Один диск остался в запасе Как мы заметили, развертывание выражений работает точно также как и развертывание подстановок имени файла по шаблону — происходит замена выражения на результат. Его можно использовать с любыми командами.

Попробуем записать список всех файлов в рабочей директории в файл, имя которого начинается со слова «test», после чего идет число равное результату умножения 25  на 132 (сколько будет? :)) и заканчивается строкой «.txt».

1
2
3
4
5
6
7
8

 
test]$ echo * > test$((25 * 132)).txt
test]$ ls
bin.txt  test1.txt  test2.txt  test3300.txt  test.txt  usr-sorted.txt  usr.txt
test]$ cat test$((25 * 132)).txt
bin.txt test1.txt test2.txt test.txt usr-sorted.txt usr.txt
test]$
 

alias

Команда alias создает «ярлык» другой команды или последовательности команд Linux.

alias позволяет:

  • Быстрее вводить команды.
  • Исправлять частые опечатки.

    Довольно распространенная ситуация, когда вместо команды ls вводится sl. В результате пользователь получает сообщение об ошибке:

    С помощью команды alias можно исправить данную проблему:

Использования команды alias для последовательности команд:

В данном алиасе команда ps используется для вывода списка запущенных процессов, в котором grep ищет процессы, соответствующие параметру $1.

Стоит отметить, что команда alias по умолчанию работает лишь для текущей сессии командной строки. Т.е. если разлогиниться или открыть другой терминал, то созданные алиасы перестанут работать. Чтобы сделать их постоянными необходимо включить их в свой локальный файл домашней директории ~/.bashrc (в случае использования bash в качестве командной оболочки).

Linux команды консоли для работы с текстом

19. more / less

Это две простенькие команды терминала для просмотра длинных текстов, которые не вмещаются на одном экране. Представьте себе очень длинный вывод команды. Или вы вызвали cat для просмотра файла, и вашему эмулятору терминала потребовалось несколько секунд, чтобы прокрутить весь текст. Если ваш терминал не поддерживает прокрутки, вы можете сделать это с помощью less. Less новее, чем more и поддерживает больше опций, поэтому использовать more нет причин.

20. head / tail

Ещё одна пара, но здесь у каждой команды своя область применения. Утилита head выводит несколько первых строк из файла (голова), а tail выдает несколько последних строк (хвост). По умолчанию каждая утилита выводит десять строк. Но это можно изменить с помощью опции -n. Ещё один полезный параметр -f, это сокращение от follow (следовать). Утилита постоянно выводит изменения в файле на экран. Например, если вы хотите следить за лог файлом, вместо того, чтобы постоянно открывать и закрывать его, используйте команду tail -nf.

21. grep

Grep, как и другие инструменты Linux, делает одно действие, но делает его хорошо: она ищет текст по шаблону. По умолчанию она принимает стандартный ввод, но вы можете искать в файлах. Шаблон может быть строкой или регулярным выражением. Она может вывести как совпадающие, так и не совпадающие строки и их контекст. Каждый раз, когда вы выполняете команду, которая выдает очень много информации, не нужно анализировать всё вручную — пусть grep делает свою магию.

22. sort

Сортировка строк текста по различным критериям. Наиболее полезные опции: -n (Numeric), по числовому значению, и -r (Reverse), которая переворачивает вывод. Это может быть полезно для сортировки вывода du. Например, если хотите отсортировать файлы по размеру, просто соедините эти команды.

24. diff

Показывает различия между двумя файлами в построчном сравнении. Причём выводятся только строки, в которых обнаружены отличия. Измененные строки отмечаются символом «с», удалнные — «d», а новые — «а». Подробнее — здесь.

Кстати, я подготовил ещё одну подробную статью, в которой описан именно просмотр содержимого текстового файла в Linux c помощью терминала.

Использование условий и циклов

  • if… then… else — используется для выполнения кода, если определенное условие выполняется
  • for — используется для выполнения команд для диапазона значений
  • while — используется для выполнения кода, если выполняется определенное условие
  • before — используется для выполнения кода, пока не выполнено определенное условие
  • case — используется для оценки ограниченного количества конкретных значений

if then elsetestif if… then… fi

else if elsetestЛистинг 4 if then else

|| и &&

if… then||&&||&&Рассмотрим эти две строки:

$1ping pingif &&||if… then… else&& ||Упражнение if… then… else

  1. Запустите редактор и создайте скрипт с именем filechk.
  2. Скопируйте содержимое из листинга 4 в этот скрипт.
  3. Запустите с ним пару тестов, такие как ./filechk /etc/hosts, ./filechck /usr, ./filechk non-existing-file.

Переменная окружения $PS1

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

В примере ниже мы несколько раз изменяем значение переменной окружения .

paul@deb503:~$ PS1=приглашение
приглашение
приглашениеPS1='приглашение '
приглашение 
приглашение PS1='> '
> 
> PS1='\u@\h$ '
paul@deb503$ 
paul@deb503$ PS1='\u@\h:\W$'
paul@deb503:~$

Для того, чтобы избежать неисправимых ошибок, вы можете использовать зеленый цвет для приглашений командной оболочки, выводимых обычным пользователям, и красный цвет для приглашений командной оболочки, выводимых пользователю root. Добавьте следующие строки в ваш файл для использования зеленого цвета в приглашениях, выводимых обычным пользователям.

# цветное приглашение командной оболочки, созданное paul
RED='\'
WHITE='\'
GREEN='\'
BLUE='\'
export PS1="${debian_chroot:+($debian_chroot)}$GREEN\u$WHITE@$BLUE\h$WHITE\w\$ "

Команды Linux для управления процессами

25. kill / xkill / pkill / killall

Служат для завершения процессов. Но они принимают различные параметры для идентификации процессов. Kill нужен PID процесса, xkill — достаточно кликнуть по окну, чтобы закрыть его, killall и pkill принимают имя процесса. Используйте ту, которая удобна в определенной ситуации.

26. ps / pgrep

Как уже говорилось, чтобы уничтожить процесс, нужен его идентификатор. Один из способов получить его, это утилита ps, которая печатает информацию о запущенных процессах. По умолчанию вывод очень длинный, поэтому используйте опцию -e, чтобы увидеть информацию об определённом процессе. Это только снимок состояния на момент вызова, и информация не будет обновляться. Команда ps с ключом aux выводит полную информацию о процессах. Pgrep работает следующим образом: вы задаете имя процесса, а утилита показывает его идентификатор. Подробнее о команде ps описано тут.

27. top / htop

Обе команды похожи, обе отображают процессы и могут быть использованы как консольные системные мониторы. Я рекомендую установить htop, если в вашем дистрибутиве он не поставляется по умолчанию, так как это улучшенная версия top. Вы сможете не только просматривать, но и контролировать процессы через его интерактивный интерфейс.

28. time

Время выполнения процесса. Это секундомер для выполнения программы. Полезно, если вам интересно, насколько сильно ваша реализация алгоритма отстает от стандартной. Но, несмотря на такое название, она не сообщит вам текущее время, используйте для этого команду date.

Команда echo linux

Команда echo — это не системная утилита, у нее нет исполняемого файла. Она существует только внутри интерпретатора Bash. Синтаксис команды echo linux очень прост:

$ echo опции строка

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

  • -n — не выводить перевод строки;
  • -e — включить поддержку вывода Escape последовательностей;
  • -E — отключить интерпретацию Escape последовательностей.

Это все опции, если включена опция -e, то вы можете использовать такие Escape последовательности для вставки специальных символов:

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

Пожалуй, это все, что нужно знать о команде echo, а теперь давайте рассмотрим как с ней работать.

Вывод информации о раскрытии команд командной оболочкой

Вы можете активировать режим вывода информации о раскрытии команд командной оболочкой с помощью команды и остановить вывод этой информации с помощью команды . У вас может возникнуть потребность в использовании данной возможности как при изучении данного курса, так и в случаях, когда возникают сомнения насчет того, как командная оболочка обрабатывает переданную вами команду.

$ set -x
++ echo -ne '\033]0;paul@RHELv4u3:~\007'
$ echo $USER
+ echo paul
paul
++ echo -ne '\033]0;paul@RHELv4u3:~\007'
$ echo \$USER
+ echo '$USER'
$USER
++ echo -ne '\033]0;paul@RHELv4u3:~\007'
$ set +x
+ set +x
$ echo $USER
paul
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: