Bash (Русский)
Состояние перевода: На этой странице представлен перевод статьи Bash. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Bash (Bourne-again Shell) — командная оболочка/язык программирования проекта GNU. Название представляет собой отсылку к предшественнику, существовавшей некогда командной оболочке Борна (Bourne shell). Bash работает в большинстве UNIX-подобных операционных систем, в том числе и в GNU/Linux.
В Arch Linux Bash является командной оболочкой, используемой по умолчанию.
Запуск
Поведение Bash зависит от способа, каким он был запущен.
Если Bash был вызван в TTY в процессе работы команды login , демоном SSH или другим схожим образом, то он считается оболочкой входа (login shell). Этот режим также можно выбрать флагом -l / —login .
Bash считается интерактивной оболочкой (interactive shell), если его стандартные потоки ввода/вывода/ошибок подключены к терминалу (например, при запуске в эмуляторе терминала), причём запуск выполнялся без опции -c и не с неопциональным аргументом (вроде bash скрипт ). Все интерактивные оболочки при запуске считывают файлы /etc/bash.bashrc и ~/.bashrc , а интерактивные оболочки входа — также /etc/profile и ~/.bash_profile .
Примечание: В Arch исполняемый файл /bin/sh (использовался в оболочке Борна) заменён символической ссылкой на /bin/bash . Если запустить Bash командой sh , то он будет вести себя маскимально приближенно к «настоящему» sh, в том числе и в смысле POSIX-совместимости.
Файлы настроек
В зависимости от способа запуска Bash считывает и исполняет определённый набор файлов. Подробнее см. раздел Bash Startup Files справочного руководства GNU Bash.
| Файл | Описание | Оболочки входа (см. примечание) | Интерактивные оболочки (не входа) |
|---|---|---|---|
| /etc/profile | Системный, считывает и исполняет файлы /etc/profile.d/*.sh и /etc/bash.bashrc с настройками приложений. | Да | Нет |
| ~/.bash_profile | Пользовательский, исполняется после /etc/profile . Если не существует, проверяются ~/.bash_login и ~/.profile (в указанном порядке). Файл-образец /etc/skel/.bash_profile содержит также указание на исполнение файла ~/.bashrc . | Да | Нет |
| ~/.bash_logout | Пользовательский, исполняется после выхода из оболочки входа. | Да | Нет |
| /etc/bash.bash_logout | Системный, исполняется после выхода из оболочки входа. Зависит от флага компиляции -DSYS_BASH_LOGOUT=»/etc/bash.bash_logout» . | Да | Нет |
| /etc/bash.bashrc | Системный, исполняет файл /usr/share/bash-completion/bash_completion . Зависит от флага компиляции -DSYS_BASHRC=»/etc/bash.bashrc» . | Нет | Да |
| ~/.bashrc | Пользовательский, исполняется после /etc/bash.bashrc . | Нет | Да |
- Оболочка входа будет неинтерактивной, если вызывается с флагом —login .
- Интерактивные оболочки (не входа) не исполняют файл ~/.bash_profile , они наследуют окружение от родительского процесса (которым может быть в том числе и оболочка входа). Подробнее см. GregsWiki:ProcessManagement#On processes, environments and inheritance.
Оболочка и переменные окружения
Поведение оболочки Bash и запущенных в ней программ зависит от переменных окружения. Переменные окружения хранят значения различных параметров оболочки, например, расположение каталогов с исполняемыми файлами или название используемого по умолчанию браузера. При запуске новой оболочки или сценария они наследуют переменные окружения родительского процесса, то есть начинают работу с набором переменных исходной оболочки [1].
Для создания переменной окружения необходимо экспортировать переменную оболочки:
VARIABLE=content export VARIABLE
или более кратко:
export VARIABLE=content
Переменные окружения принято перечислять в файлах ~/.profile или /etc/profile , чтобы другие Bourne-совместимые оболочки могли их использовать.
Командная строка
Командная строка Bash работает под управлением библиотеки Readline. Readline позволяет использовать комбинации клавиш в стиле emacs и vi для взаимодействия с командной строкой, например, для перемещения назад и вперёд целыми словами, удаления слов и т.д. Кроме того, Readline отвечает за хранение истории выполненных команд, а также позволяет создавать макросы.
Автодополнение
Автодополнение (tab completion) — завершение вводимых команд по нажатию клавиши Tab (работает по умолчанию).
Одиночное нажатие
Вывести список возможных завершений для частично введённой команды можно несколькими повторными нажатиями клавиши Tab — иногда двумя или тремя. В статье Readline#Быстрое завершение описано, как уменьшить количество нажатий до одного.
Дополнительные программы и опции
По умолчанию Bash позволяет дополнять команды, имена файлов и переменные. Пакет bash-completion добавляет автодополнение для наиболее распространённых команд и их опций, которые можно включить, считав и исполнив файл /usr/share/bash-completion/bash_completion (обычно считывается автоматически в /etc/bash.bashrc ). С пакетом bash-completion обычные завершения (вроде $ ls file.* ) будут вести себя немного по-другому, вернуть старое поведение можно командой $ compopt -o bashdefault программа (подробнее см. [2] и [3]).
Настройки для команд
Примечание: Встроенная команда Bash complete может конфликтовать с bash-completion .
По умолчанию Bash помогает завершать только имена файлов, которые следуют за командой. Это можно перенастроить командой complete -c , чтобы дополнялись и определённые команды:
~/.bashrc
complete -c man which
С флагами -cf завершаться будут и команды, и имена файлов после них:
complete -cf sudo
Другие опции автодополнения можно найти в руководстве Bash.
История команд
Автодополнение истории
Клавиши стрелок «вверх» и «вниз» можно назначить для поиска команд в истории (см. Readline#История команд и Синтаксис init-файлов Readline):
~/.bashrc
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
Или же, чтобы это работало во всех программах Readline:
~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Сокращение истории
Переменная HISTCONTROL позволяет предотвратить логирование некоторых команд. Например, чтобы одинаковые команды не попадали в историю, присвойте переменной следующее значение:
~/.bashrc
export HISTCONTROL=ignoredups
Если же задать значение erasedups , то дополнительно из истории будут удалены уже существующие дубликаты команд. Подробнее см. руководство Bash.
Отключение истории
Чтобы временно отключить историю, выполните:
$ set +o history
После этого вводимые команды не будут сохраняться в $HISTFILE .
Теперь можно выполнять «чувствительные» в плане безопасности действия, вроде вычисления хэш-суммы пароля ( printf secret | sha256sum ) или работы с GPG ( gpg -eaF secret-pubkey.asc ), не опасаясь, что секретный ключ будет сохранён на диск.
Включить историю обратно можно командой
$ set -o history
Совет: Если переменная HISTCONTROL имеет значение ignorespace , команды, начинающиеся с пробела, не будут сохраняться в файл истории. Подробнее см. bash(1) § Shell Variables .
Чтобы отключить всю историю Bash:
~/.bashrc или /etc/profile
export HISTSIZE=0
После необходимо удалить старый файл истории (имейте в виду — команды ниже удалят его безвозвратно):
$ wipe -i -l2 -x4 -p4 "$HISTFILE" $ ln -sv /dev/null "$HISTFILE"
run-help из Zsh
В Zsh есть возможность вызывать справочное руководство для команды перед курсором по комбинации клавиш Alt+h . В Bash то же самое можно сделать с помощью привязки комбинации клавиш в Readline:
~/.bashrc
run-help() < help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; > bind -m vi-insert -x '"\eh": run-help' bind -m emacs -x '"\eh": run-help'
Предполагается, что вы используете (стандартный) режим редактирования Emacs.
Псевдонимы
alias (англ. псевдоним) — команда для замены одной строки на другую. Часто используется для сокращения системных команд до аббревиатур или для добавления стандартных аргументов к часто используемым командам.
Пользовательские псевдонимы хранятся в файле ~/.bashrc , а системные (для всех пользователей) — в /etc/bash.bashrc . Примеры можно посмотреть в [4].
Функции Bash подробно описаны в Bash/Функции.
Советы и рекомендации
Настройка приглашения
Подстветка синтаксиса и подсказки
blesh-git AUR — редактор командной строки, который написан на чистом Bash и предназначен заменить Readline. Предлагает множество дополнительных возможностей вроде подстветки синтаксиса, подсказок, завершения команд с выпадающим меню, аббревиатур, режима редактирования Vim, хук-функций и т.д.
После установки необходимо считать и выполнить его в интерактивном сеансе. Настройки подробно объясняются в файле ~/.blerc и wiki. Доступна также стабильная сборка blesh AUR .
Command not found
В pkgfile есть хук «command not found», который при вводе неизвестной команды автоматически ищет подходящий исполняемый файл в пакетах в официальных репозиториях.
Чтобы хук заработал, его необходимо считать и исполнить:
~/.bashrc
source /usr/share/doc/pkgfile/command-not-found.bash
После этого при попытке запустить недоступную команду будет выведена следующая информация:
$ abiword
abiword may be found in the following packages: extra/abiword 3.0.1-2 /usr/bin/abiword
Примечание: Предварительно необходимо обновить базу данных pkgfile. Подробнее см. pkgfile#Установка.
Отключение комбинации Ctrl+z
Нажатие Ctrl+z в терминале ставит приложение на паузу или закрывает его. Отключить эту комбинацию клавиш можно следующим образом:
#!/bin/bash trap "" 20 adom
Если после этого во время работы adom AUR вы по ошибке вместо Shift+z нажмёте комбинацию Ctrl+z , то она будет проигнорирована и ничего не произойдёт.
Очистка экрана после выхода
Очистка экрана виртуального терминала после выхода:
~/.bash_logout
clear reset
Смена каталога при вводе пути
Bash может автоматически добавлять команду cd , если введён только путь к каталогу. Стандартное поведение:
bash: /etc: Is a directory
Если же добавить в .bashrc строку
~/.bashrc
. shopt -s autocd .
то произойдёт следующее:
[user@host ~]$ /etc cd /etc [user@host etc]$
Autojump
autojump-git AUR позволяет перемещаться по файловой системе с помощью поиска строк в базе данных с часто посещаемыми путями. Чтобы приложение заработало, после установки необходимо считать и выполнить файл /etc/profile.d/autojump.bash .
Запрет на перезапись файлов
Отключение перезаписи файлов с помощью перенаправления вывода на время текущего сеанса:
$ set -o noclobber
Команда set -C делает то же самое.
Сделать изменения постоянными:
~/.bashrc
set -o noclobber
Принудительно перезаписать файл при установленном noclobber :
$ echo "output" >| file.txt
Решение проблем
Перенос строк при изменении размера окна
При изменении размера окна эмулятора терминала Bash может не получить соответствующий сигнал. В результате выведенный текст будет переноситься некорректно и перекроет приглашение командной строки. Опция оболочки checkwinsize проверяет размер окна после каждой команды и при необходимости обновляет значения переменных LINES и COLUMNS .
~/.bashrc
shopt -s checkwinsize
Оболочка завершается даже с опцией ignoreeof
После задания опции ignoreeof вы можете обнаружить, что многократное нажатие Ctrl-d всё равно приводит к завершению процесса оболочки. Дело в том, что по умолчанию эта опция позволяет игнорировать только 10 нажатий данной комбинации клавиш (если быть точным — 10 ситуаций EOF) перед выходом из оболочки.
Задать большее значение можно переменной IGNOREEOF. Например:
export IGNOREEOF=100
Анализ сценария и поиск ошибок
Программа shellcheck проверяет сценарии Bash (и других командных оболочек) на предмет ошибок и предлагает возможные улучшения кода.
Существует также веб-сайт shellcheck.net, разработанный на основе одноименной программы и предназначенный для той же цели.
Смотрите также
- Wikipedia:ru:Bash
- Справочное руководство Bash, также локально в файле /usr/share/doc/bash/bashref.html
- Синтаксис init-файлов Readline
- The Bourne-Again Shell — Третья глава книги The Architecture of Open Source Applications
- PS1 generator — Наглядное создание приглашения Bash с помощью мыши
- Полезные команды для .bashrc
Обучение
- Greg’s Wiki
- GregsWiki:BashGuide
- GregsWiki:BashFAQ
- Quote Tutorial
Сообщество
Примеры
Работа с файлами и каталогами в Linux
Рассказываем о просмотре доступных файлов и каталогов, командах для работы с файлами и основах редактирования в текстовом редакторе nano.
Эта инструкция — часть курса «Linux: горячие клавиши и команды».
Смотреть весь курс
Введение
В этом руководстве для начинающих пользователей мы ознакомимся с основными командами для работы с файлами и каталогами (иногда их еще называют директориями) в Linux-системах.
Требования
Cервер с Ubuntu 20.04
Все команды, описанные ниже, будут работать и в других дистрибутивах Linux.
Расположение каталогов в файловой системе
При входе на сервер, вы, как правило, попадаете в домашний каталог вашей учетной записи, отведенный для хранения файлов и создания директорий.
Для того чтобы узнать, где располагается каталог, в котором мы сейчас находимся, используется команда:
Результат выполнения команды выглядит следующим образом:
/home/demo
Домашний каталог располагается после имени учетной записи пользователя, в приведенном примере он называется /demo. Этот каталог находится в каталоге с именем /home и в каталоге верхнего уровня, который называется root или корневой каталог, поэтому представлен одной косой чертой /.
Просмотр содержимого каталогов
Для просмотра содержимого каталога используется команда ls. Название этой команды является сокращением слов list files.
Просмотреть содержимое любой директории можно следующими способами:
ls имя_директории
Либо введя команду:
ls /путь _к _директории
В результате выполнения команды отображаются файлы и каталоги, находящиеся внутри данного каталога:
dir1 file1 file2 file3
К команде ls можно добавлять дополнительные флаги, например, чтобы показать детализированное представление (права, список владельцев файлов или папок, размер, дату последнего модифицирования) файлов и директорий в текущей директории, можно использовать флаг -l:
ls -l
Результат выполнения команды:
total 16 drwxr-xr-x 2 home demo 4096 Nov 3 17:40 dir1 -rw-r--r-- 1 home demo 13 Nov 8 17:17 file1 -rw-r--r-- 1 home demo 42 Nov 9 13:04 file2 -rw-r--r-- 1 home demo 42 Nov 10 13:04 file3
Для просмотра списка всех файлов, включая скрытые файлы и каталоги, вы можете добавить флаг -a:
ls -a
Результат выполнения команды:
. dir1 file1 .mysql_history .ssh .. .bash_history file2 file3 .nan
Отобразить содержимое текущей директории с добавлением к именам символов, характеризующих тип, можно с помощью команды:
ls -F
Результат выполнения команды:
dir1/ file1 file2 file3
Перемещение между каталогами
Для перехода в домашний каталог используется команда cd. Название этой команды является сокращением слов change directory.
Для перехода в домашний каталог пользователя user используется команда:
cd ~user
Для перехода в предыдущую директорию, в которой мы находились до перехода в текущую директорию также используется команда cd.
В Linux-системах каждый файл и каталог находятся в самой верхней директории, которая называется «корневой» и обозначается одним символом слэш /.
Абсолютный путь указывает на расположение каталога по отношению к этой директории верхнего уровня. Это позволяет обращаться к справочникам однозначным образом из любого места в файловой системе.
Каждый абсолютный путь должен начинаться с косой черты — символа слэш /.
Для перехода в директорию уровнем выше используется команда:
Для перехода в директорию двумя уровнями выше:
Операции с файлами и каталогами
У каждой команды имеется множество параметров, чтобы узнать их, наберите команду и параметр —help, например:
ls --help
Далее приведен список основных команд навигации в консоли Linux.
Создание
Создание файлов производится с помощью команды:
touch имя_файла
Создание каталогов выполняется с помощью команды вида:
mkdir имя_директории
Название этой команды является сокращением слов make directory.
Создание двух каталогов одновременно выполняется с помощью команды:
mkdir имя_директории_1 имя_директории_2
Для создания дерева каталогов используется команда следующего вида:
mkdir -p /имя_директории_1/имя_директории_2
Удаление
Для удаления директорий используется команда rmdir имя_директории. Название этой команды является сокращением слов remove directory.
Для удаления файлов используется команда rm. Например, для удаления файла с именем file1 используется команда:
rm file1
Команда rm также позволяет удалять не только файлы, но и каталоги.
Для удаления директории с именем dir1 со всеми подкаталогами и файлами используется опция -r (от слова recursive):
rm -r dir1
Можно удалить одновременно две директории со всем их содержимым:
rm -r имя_директории_1 имя_директории_2
Также можно использовать параметр -f, который означает, что при удалении не будет запрашиваться подтверждение.
Команда для удаления файла будет выглядеть так:
rm -f file1
Команда для удаления каталога:
rm -rf dir1
Перемещение
Для перемещения и переименования файлов и каталогов используется команда mv. Название этой команды является сокращением слова move.
Переименовать файл можно с помощью команды:
mv имя_файла новое_имя
Для того чтобы переместить файл, используется команда:
mv имя_файла путь/
Копирование
Для копирования используется команда cp. Название этой команды является сокращением слова copy.
Чтобы скопировать файл file1 и назвать его file2, используется команда:
cp file1 file2
Для того чтобы копировать директорию dir1 в директорию dir2, используется команда:
cp -a dir1/ dir2/
Скопировать файл с именем file1 в директорию с именем dir1, можно с помощью команды:
cp file1 dir1/
Редактирование файлов
Мы ознакомились с основными командами для работы с каталогами и файлами.
Далее мы изучим, как редактировать файлы и добавлять в них содержание.
Команда nano позволяет работать в одном из самых простых текстовых редакторов командной строки Linux, который занимает весь терминал в течение всего срока его использования.
В результате ввода в терминал команды nano будет открыт чистый файл.
Интерфейс выглядит следующим образом:

В верхней части открывшегося редактора отображается имя приложения и имя файла, который мы редактируем.
В середине должно располагаться содержимое файла, в настоящее время оно пустое.
В нижней части интерфейса расположен ряд комбинаций клавиш, которые указывают с основными элементами управления текстового редактора. Для каждого из них символ ^ означает клавишу CTRL.
Для того чтобы открыть справку используйте сочетание клавиш CTRL-G.
Закрывается справка с помощью сочетания клавиш CTRL-X. После закрытия справки мы возвращаемся к редактированию.
Вводить и редактировать можно любой текст, например, можно ввести: “Hello World!”
Для сохранения внесенных изменений следует нажать сочетание клавиш CTRL-O. Внимание! Это буква О, а не ноль.
Далее система попросит вас ввести либо подтвердить имя файла, который вы хотите сохранить:
File Name to Write: ^G Get Help M-D DOS Format M-A Append M-B Backup File ^C Cancel M-M Mac Format M-P Prepend
Как вы можете видеть, параметры в нижней части окна редактирования также изменились. Они являются контекстными, то есть будут меняться в зависимости от того, что вы пытаетесь сделать.
После ввода имени файла нажмите клавишу ENTER.
Для того чтобы выйти из тестового редактора нажмите сочетание клавиш CTRL-X.
Если вы внесли изменения и не сохранили файл, вам будет предложено сохранить сделанные вами изменения:
Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ? Y Yes N No ^C Cancel
Вы можете нажать клавишу Y, чтобы сохранить изменения, клавишу N для отмены изменений и выхода, или сочетание клавиш CTRL-C, чтобы отменить операцию выхода из режима редактирования файла.
Если вы решили сохранить изменения, вам будет предложено сохранить их в том же файле, который был отредактирован.
Нажмите клавишу ENTER, чтобы сохранить файл и выйти из редактора.
Заключение
Мы ознакомились с возможностями просмотра доступных файлов и каталогов, с основными командами для работы с файлами, которые позволяют просматривать, копировать, перемещать и удалять файлы, а также с основами редактирования в текстовом редакторе nano.
Структура и типы файловых систем в Linux
Bash-скрипты, часть 2: циклы
В прошлый раз мы рассказали об основах программирования для bash. Даже то немногое, что уже разобрано, позволяет всем желающим приступить к автоматизации работы в Linux. В этом материале продолжим рассказ о bash-скриптах, поговорим об управляющих конструкциях, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for и while , о методах работы с ними и о практических примерах их применения.


Внимание: в посте спрятана выгода!
Циклы for
Оболочка bash поддерживает циклы for , которые позволяют организовывать перебор последовательностей значений. Вот какова базовая структура таких циклов:
for var in list do команды done
В каждой итерации цикла в переменную var будет записываться следующее значение из списка list . В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором — второе, и так далее — до тех пор, пока цикл не дойдёт до последнего элемента.
Перебор простых значений
Пожалуй, самый простой пример цикла for в bash-скриптах — это перебор списка простых значений:
#!/bin/bash for var in first second third fourth fifth do echo The $var item done
Ниже показаны результаты работы этого скрипта. Хорошо видно, что в переменную $var последовательно попадают элементы из списка. Происходит так до тех пор, пока цикл не дойдёт до последнего из них.

Простой цикл for
Обратите внимание на то, что переменная $var сохраняет значение при выходе из цикла, её содержимое можно менять, в целом, работать с ней можно как с любой другой переменной.
Перебор сложных значений
В списке, использованном при инициализации цикла for , могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слов и знаков препинания. Например, всё это может выглядеть так:
#!/bin/bash for var in first "the second" "the third" "I’ll do it" do echo "This is: $var" done
Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем.

Перебор сложных значений
TNW-CUS-FMP — промо-код на 10% скидку на наши услуги, доступен для активации в течение 7 дней»
Инициализация цикла списком, полученным из результатов работы команды
Ещё один способ инициализации цикла for заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.
#!/bin/bash file="myfile" for var in $(cat $file) do echo " $var" done
В этом примере задействована команда cat , которая читает содержимое файла. Полученный список значений передаётся в цикл и выводится на экран. Обратите внимание на то, что в файле, к которому мы обращаемся, содержится список слов, разделённых знаками перевода строки, пробелы при этом не используются.

Цикл, который перебирает содержимое файла
Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки.
Что, если это совсем не то, что нужно?
Разделители полей
Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:
- Пробел
- Знак табуляции
- Знак перевода строки
Для того, чтобы решить проблему, можно временно изменить переменную среды IFS . Вот как это сделать в bash-скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки:
IFS=$'\n'
После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
#!/bin/bash file="/etc/passwd" IFS=$'\n' for var in $(cat $file) do echo " $var" done
Если этот скрипт запустить, он выведет именно то, что от него требуется, давая, в каждой итерации цикла, доступ к очередной строке, записанной в файл.

Построчный обход содержимого файла в цикле for
Разделителями могут быть и другие символы. Например, выше мы выводили на экран содержимое файла /etc/passwd . Данные о пользователях в строках разделены с помощью двоеточий. Если в цикле нужно обрабатывать подобные строки, IFS можно настроить так:
Обход файлов, содержащихся в директории
Один из самых распространённых вариантов использования циклов for в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.
Например, вот как можно вывести список файлов и папок:
#!/bin/bash for file in /home/likegeeks/* do if [ -d "$file" ] then echo "$file is a directory" elif [ -f "$file" ] then echo "$file is a file" fi done
Если вы разобрались с предыдущим материалом из этой серии статей, вам должно быть понятно устройство конструкции if-then , а так же то, как отличить файл от папки. Если вам сложно понять вышеприведённый код, перечитайте этот материал.
Вот что выведет скрипт.

Вывод содержимого папки
Обратите внимание на то, как мы инициализируем цикл, а именно — на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий: «все файлы с любыми именами». он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону.
При проверке условия в операторе if , мы заключаем имя переменной в кавычки. Сделано это потому что имя файла или папки может содержать пробелы.
Циклы for в стиле C
Если вы знакомы с языком программирования C, синтаксис описания bash-циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:
for (i = 0; i
В bash-скриптах можно использовать циклы for , описание которых выглядит очень похожим на циклы в стиле C, правда, без некоторых отличий тут не обошлось. Схема цикла при подобном подходе выглядит так:
for (( начальное значение переменной ; условие окончания цикла; изменение переменной ))
На bash это можно написать так:
for (( a = 1; a < 10; a++ ))
А вот рабочий пример:
#!/bin/bash for (( i=1; i
Этот код выведет список чисел от 1 до 10.

Работа цикла в стиле C
Цикл while
Конструкция for — не единственный способ организации циклов в bash-скриптах. Здесь можно пользоваться и циклами while . В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится.
Вот схема организации циклов while
while команда проверки условия
do
другие команды
done
Взглянем на пример скрипта с таким циклом:
#!/bin/bash var1=5 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] done
На входе в цикл проверяется, больше ли нуля переменная $var1 . Если это так, выполняется тело цикла, в котором из значения переменной вычитается единица. Так происходит в каждой итерации, при этом мы выводим в консоль значение переменной до его модификации. Как только $var1 примет значение 0, цикл прекращается.

Результат работы цикла while
Если не модифицировать переменную $var1 , это приведёт к попаданию скрипта в бесконечный цикл.
Вложенные циклы
В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами:
#!/bin/bash for (( a = 1; a
Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом — три итерации внутреннего, после его завершения снова в дело вступает внешний цикл, потом опять — внутренний.

Вложенные циклы
Обработка содержимого файла
Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd :
#!/bin/bash IFS=$'\n' for entry in $(cat /etc/passwd) do echo "Values in $entry –" IFS=: for value in $entry do echo " $value" done done
В этом скрипте два цикла. Первый проходится по строкам, используя в качестве разделителя знак перевода строки. Внутренний занят разбором строк, поля которых разделены двоеточиями.

Обработка данных файла
Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель.
Управление циклами
Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла. Надо ли будет в такой ситуации дожидаться нормального завершения цикла? Нет конечно, и в подобных случаях пригодятся следующие две команды:
Команда break
Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов for , и для циклов while :
#!/bin/bash for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Number: $var1" done
Такой цикл, в обычных условиях, пройдётся по всему списку значений из списка. Однако, в нашем случае, его выполнение будет прервано, когда переменная $var1 будет равна 5.

Досрочный выход из цикла for
Вот — то же самое, но уже для цикла while :
#!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi echo "Iteration: $var1" var1=$(( $var1 + 1 )) done
Команда break , исполненная, когда значение $var1 станет равно 5, прерывает цикл. В консоль выведется то же самое, что и в предыдущем примере.
Команда continue
Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for :
#!/bin/bash for (( var1 = 1; var1 < 15; var1++ )) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number: $var1" done
Когда условие внутри цикла выполняется, то есть, когда $var1 больше 5 и меньше 10, оболочка исполняет команду continue . Это приводит к пропуску оставшихся в теле цикла команд и переходу к следующей итерации.

Команда continue в цикле for
Обработка вывода, выполняемого в цикле
Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции done .
Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:
#!/bin/bash for (( a = 1; a < 10; a++ )) do echo "Number is $a" done >myfile.txt echo "finished."
Оболочка создаст файл myfile.txt и перенаправит в этот файл вывод конструкции for . Откроем файл и удостоверимся в том, что он содержит именно то, что ожидается.

Перенаправление вывода цикла в файл
Пример: поиск исполняемых файлов
Давайте воспользуемся тем, что мы уже разобрали, и напишем что-нибудь полезное. Например, если надо выяснить, какие именно исполняемые файлы доступны в системе, можно просканировать все папки, записанные в переменную окружения PATH . Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино:
#!/bin/bash IFS=: for folder in $PATH do echo "$folder:" for file in $folder/* do if [ -x $file ] then echo " $file" fi done done
Такой вот скрипт, небольшой и несложный, позволил получить список исполняемых файлов, хранящихся в папках из PATH .

Поиск исполняемых файлов в папках из переменной PATH
Итоги
Сегодня мы поговорили о циклах for и while в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.
Если предположить, что вы — разработчик bash-скриптов, который знает о них только то, что изложено в первой части этого цикла статей, и в этой, второй, то вы уже вполне можете написать кое-что полезное. Впереди — третья часть, разобравшись с которой, вы узнаете, как передавать bash-скриптам параметры и ключи командной строки, и что с этим всем делать.
Уважаемые читатели! В комментариях к предыдущему материалу вы рассказали нам много интересного. Уверены, всё это окажет неоценимую помощь тем, кто хочет научиться программировать для bash. Но тема эта огромна, поэтому снова просим знатоков поделиться опытом, а новичков — впечатлениями.

- Блог компании RUVDS.com
- Настройка Linux
- Серверное администрирование
Bash - что это такое и как пользоваться
Bash - это одна из самых известных командных оболочек Linux. Она позволяет выполнять различные команды ОС, а также наборы команд, оформленные в виде файлов, так называемые скрипты или сценарии. С помощью bash можно реализовывать конструкции циклов и ветвлений (for и if), перенаправлять ввод-вывод в файлы, считывать параметры из файлов, с клавиатуры, использовать переменные и т.д.
Для того чтобы выполнить команду ОС достаточно просто ввести ее в окне bash. Например:
- pwd - вывод текущего каталога
- ls - вывод списка файлов в текущем каталоге.
У большинства команд есть аргументы, например:
- cd \etc\sysconfig - перейти в каталог \etc\sysconfig,
- ls \home - вывести список файлов в каталоге \home.
Также у команд есть ключи, меняющие поведение или отображение результатов команд:
- ls -1 \home - выводит имена файлов и папок в каталоге \home списком
- ls -l \home - выводит подробную информацию от каждом файле и папке в каталоге \home
Параметры и ключи каждой команды можно посмотреть используя справочную систему man, то есть чтобы посмотреть аргументы и ключи команды cp достаточно набрать man cp и т.д.
Также можно объединять команды в последовательность действий, так называемые скрипты или сценарии.
Рассмотрим, например, скрипт проверяющий строку на совпадение с ранее заданной строкой и количество символов в ней. Для создания скрипта создайте пустой файл. Для создания файла можно использовать команду touch , например так:
Расширение у скрипта может быть любое, но рекомендуемый стандарт *.sh (SHell script).
Поместите в него нижеприведенные строки. Построчно поясню что означают те или иные строки. Комментарии и директивы процессора начинаются с символа # и идут до конца строки.
Любой скрипт начинается со строки #!/bin/bash - это позволяет понять ОС какой командный интерпретатор использовать. В нашем случае это bash.
#!/bin/bash #Зададим значения переменных “code” и “string”. String - пустая строка. code='4567' string=''” #Вывод фразы 'введите проверочный код: ' ключ -n запрещает переход на новую строку. echo -n 'введите проверочный код: ' #Ожидание ввода значения с клавиатуры и помещение результата в переменную “string” read string #Проверка условия на количество введенных букв в строке. if [[ -n $string ]]; then #вложенная проверка условия на совпадение введенной строки со значением #в переменной code if [[ $code = $string ]]; then echo 'проверочный код совпал' else echo 'код не прошел проверку' fi else echo 'слишком короткий код' fi
Теперь дадим этому скрипту права на исполнение используя команду chmod
chmod +x /home/user/script1.sh
Теперь этот скрипт можно запускать, вставлять в планировщик cron, в другие скрипты и т.д. Например нижеприведенная команда выполнит данный скрипт.