- Основы BASH. Часть 1
- Введение
- Что необходимо знать с самого начала
- Переменные и параметры скрипта
- Условия
- Условия. Множественный выбор
- Bash (Русский)
- Contents
- Запуск
- Файлы настроек
- Оболочка и переменные окружения
- Командная строка
- Автодополнение
- Одиночное нажатие
- Дополнительные программы и опции
- Настройки для команд
- История команд
- Автодополнение истории
- Сокращение истории
- Отключение истории
- run-help из Zsh
- Псевдонимы
- Советы и рекомендации
- Настройка приглашения
- Подстветка синтаксиса и подсказки
- Command not found
- Отключение комбинации Ctrl+z
- Очистка экрана после выхода
- Смена каталога при вводе пути
- Autojump
- Запрет на перезапись файлов
- Решение проблем
- Перенос строк при изменении размера окна
- Оболочка завершается даже с опцией ignoreeof
- Анализ сценария и поиск ошибок
Основы BASH. Часть 1
Введение
break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.
И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе
Что необходимо знать с самого начала
1. Любой bash-скрипт должен начинаться со строки:
#!/bin/bash
в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash) поменяйте её на ваш путь.
2. Коментарии начинаются с символа # (кроме первой строки).
3. В bash переменные не имеют типа(о них речь пойдет ниже)
Переменные и параметры скрипта
Приведу как пример небольшой пример, который мы разберем:
#!/bin/bash
#указываем где у нас хранится bash-интерпретатор
parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скрипта
script_name=$0 #присваиваем переменной script_name значение имени скрипта
echo «Вы запустили скрипт с именем $script_name и параметром $parametr1» # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной.
echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’ # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных.
exit 0 #Выход с кодом 0 (удачное завершение работы скрипта)
Результат выполнения скрипта:
$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty
Вы запустили скрипт с именем $script_name и параметром $parametr1
После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:
$DIRSTACK — содержимое вершины стека каталогов
$EDITOR — текстовый редактор по умолчанию
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как.
$UID — . содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME — имя текущей функции в скрипте.
$GROUPS — массив групп к которым принадлежит текущий пользователь
$HOME — домашний каталог пользователя
$HOSTNAME — ваш hostname
$HOSTTYPE — архитектура машины.
$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов
$OLDPWD — прежний рабочий каталог
$OSTYPE — тип ОС
$PATH — путь поиска программ
$PPID — идентификатор родительского процесса
$SECONDS — время работы скрипта(в сек.)
$# — общее количество параметров переданных скрипту
$* — все аргументы переданыне скрипту(выводятся в строку)
$@ — тоже самое, что и предыдущий, но параметры выводятся в столбик
$! — PID последнего запущенного в фоне процесса
$$ — PID самого скрипта
Условия
Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере):
#!/bin/bash
source=$1 #в переменную source засовываем первый параметр скрипта
dest=$2 #в переменную dest засовываем второй параметр скрипта
if [[ «$source» -eq «$dest» ]] # в ковычках указываем имена переменных для сравнения. -eq — логическое сравнение обозначающие «равны»
then # если они действительно равны, то
echo «Применик $dest и источник $source один и тот же файл!» #выводим сообщение об ошибке, т.к. $source и $dest у нас равны
exit 1 # выходим с ошибкой (1 — код ошибки)
else # если же они не равны
cp $source $dest # то выполняем команду cp: копируем источник в приемник
echo «Удачное копирование!»
fi #обозначаем окончание условия.
Результат выполнения скрипта:
ite@ite-desktop:
$ ./primer2.sh 1 1
Применик 1 и источник 1 один и тот же файл!
ite@ite-desktop:
$ ./primer2.sh 1 2
Удачное копирование!
Структура if-then-else используется следующим образом:
if
then
else
В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , test, (( )) или любая другая(или несколько) linux-команда.
test — используется для логического сравнения. после выражения, неоьбходима закрывающая скобка «]»
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.
для построения многоярусных условий вида:
if .
then .
else
if .
then.
else .
для краткости и читаемости кода, можно использовать структуру:
if ..
then .
elif .
then .
elif .
Условия. Множественный выбор
Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.
#!/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.
Результат работы:
ite@ite-desktop:
$ ./menu2.sh
Выберите редатор для запуска:
1 Запуск программы nano
2 Запуск программы vi
3 Запуск программы emacs
4 Выход
После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )
Прведу список логических операторв, которые используются для конструкции if-then-else-fi:
-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( ) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»
С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.
UPD: Исправил некоторые ошибки
UPD: Обновил часть про условия if-then-else
Источник
Bash (Русский)
Bash (Bourne-again Shell) — командная оболочка/язык программирования проекта GNU. Название представляет собой отсылку к предшественнику, существовавшей некогда командной оболочке Борна (Bourne shell). Bash работает в большинстве UNIX-подобных операционных систем, в том числе и в GNU/Linux.
В Arch Linux Bash является командной оболочкой, используемой по умолчанию.
Contents
Запуск
Поведение Bash зависит от способа, каким он был запущен.
Если Bash был вызван в TTY в процессе работы команды login , демоном SSH или другим схожим образом, то он считается оболочкой входа (login shell). Этот режим также можно выбрать флагом -l / —login .
Bash считается интерактивной оболочкой (interactive shell), если его стандартные потоки ввода/вывода/ошибок подключены к терминалу (например, при запуске в эмуляторе терминала), причём запуск выполнялся без опции -c и не с неопциональным аргументом (вроде bash скрипт ). Все интерактивные оболочки при запуске считывают файлы /etc/bash.bashrc и
/.bashrc , а интерактивные оболочки входа — также /etc/profile и
Файлы настроек
В зависимости от способа запуска Bash считывает и исполняет определённый набор файлов. Подробнее см. раздел Bash Startup Files справочного руководства GNU Bash.
Файл | Описание | Оболочки входа (см. примечание) | Интерактивные оболочки (не входа) |
---|---|---|---|
/etc/profile | Системный, считывает и исполняет файлы /etc/profile.d/*.sh и /etc/bash.bashrc с настройками приложений. | Да | Нет |
Пользовательский, исполняется после /etc/profile . Если не существует, проверяются /.profile (в указанном порядке). Файл-образец /etc/skel/.bash_profile содержит также указание на исполнение файла /.bashrc . | Да | Нет | |
Пользовательский, исполняется после выхода из оболочки входа. | Да | Нет | |
/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» . | Нет | Да |
Пользовательский, исполняется после /etc/bash.bashrc . | Нет | Да |
/.bash_profile , они наследуют окружение от родительского процесса (которым может быть в том числе и оболочка входа). Подробнее см. GregsWiki:ProcessManagement#On processes, environments and inheritance.
Оболочка и переменные окружения
Поведение оболочки Bash и запущенных в ней программ зависит от переменных окружения. Переменные окружения хранят значения различных параметров оболочки, например, расположение каталогов с исполняемыми файлами или название используемого по умолчанию браузера. При запуске новой оболочки или сценария они наследуют переменные окружения родительского процесса, то есть начинают работу с набором переменных исходной оболочки [1].
Для создания переменной окружения необходимо экспортировать переменную оболочки:
или более кратко:
Переменные окружения принято перечислять в файлах
/.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 -c , чтобы дополнялись и определённые команды:
С флагами -cf завершаться будут и команды, и имена файлов после них:
Другие опции автодополнения можно найти в руководстве Bash.
История команд
Автодополнение истории
Клавиши стрелок «вверх» и «вниз» можно назначить для поиска команд в истории (см. Readline#История команд и Синтаксис init-файлов Readline):
Или же, чтобы это работало во всех программах Readline:
Сокращение истории
Переменная HISTCONTROL позволяет предотвратить логирование некоторых команд. Например, чтобы одинаковые команды не попадали в историю, присвойте переменной следующее значение:
Если же задать значение erasedups , то дополнительно из истории будут удалены уже существующие дубликаты команд. Подробнее см. руководство Bash.
Отключение истории
Чтобы временно отключить историю, выполните:
После этого вводимые команды не будут сохраняться в $HISTFILE .
Теперь можно выполнять «чувствительные» в плане безопасности действия, вроде вычисления хэш-суммы пароля ( printf secret | sha256sum ) или работы с GPG ( gpg -eaF secret-pubkey.asc ), не опасаясь, что секретный ключ будет сохранён на диск.
Включить историю обратно можно командой
Чтобы отключить всю историю Bash:
После необходимо удалить старый файл истории (имейте в виду — команды ниже удалят его безвозвратно):
run-help из Zsh
В Zsh есть возможность вызывать справочное руководство для команды перед курсором по комбинации клавиш Alt+h . В Bash то же самое можно сделать с помощью привязки комбинации клавиш в Readline:
Предполагается, что вы используете (стандартный) режим редактирования 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», который при вводе неизвестной команды автоматически ищет подходящий исполняемый файл в пакетах в официальных репозиториях.
Чтобы хук заработал, его необходимо считать и исполнить:
После этого при попытке запустить недоступную команду будет выведена следующая информация:
Существует альтернативный хук «command not found» в виде пакета command-not-found AUR , результат работы которого выглядит следующим образом:
Отключение комбинации Ctrl+z
Нажатие Ctrl+z в терминале ставит приложение на паузу или закрывает его. Отключить эту комбинацию клавиш можно следующим образом:
Если после этого во время работы adom AUR вы по ошибке вместо Shift+z нажмёте комбинацию Ctrl+z , то она будет проигнорирована и ничего не произойдёт.
Очистка экрана после выхода
Очистка экрана виртуального терминала после выхода:
Смена каталога при вводе пути
Bash может автоматически добавлять команду cd , если введён только путь к каталогу. Стандартное поведение:
Если же добавить в .bashrc строку
то произойдёт следующее:
Autojump
autojump-git AUR позволяет перемещаться по файловой системе с помощью поиска строк в базе данных с часто посещаемыми путями. Чтобы приложение заработало, после установки необходимо считать и выполнить файл /etc/profile.d/autojump.bash .
Запрет на перезапись файлов
Отключение перезаписи файлов с помощью перенаправления вывода на время текущего сеанса:
Команда set -C делает то же самое.
Сделать изменения постоянными:
Принудительно перезаписать файл при установленном noclobber :
Решение проблем
Перенос строк при изменении размера окна
При изменении размера окна эмулятора терминала Bash может не получить соответствующий сигнал. В результате выведенный текст будет переноситься некорректно и перекроет приглашение командной строки. Опция оболочки checkwinsize проверяет размер окна после каждой команды и при необходимости обновляет значения переменных LINES и COLUMNS .
Оболочка завершается даже с опцией ignoreeof
После задания опции ignoreeof вы можете обнаружить, что многократное нажатие Ctrl-d всё равно приводит к завершению процесса оболочки. Дело в том, что по умолчанию эта опция позволяет игнорировать только 10 нажатий данной комбинации клавиш (если быть точным — 10 ситуаций EOF) перед выходом из оболочки.
Задать большее значение можно переменной IGNOREEOF. Например:
Анализ сценария и поиск ошибок
Программа shellcheck проверяет сценарии Bash (и других командных оболочек) на предмет ошибок и предлагает возможные улучшения кода.
Источник