Командная оболочка (интерпретатор) bash является самой популярной в Linux: пользователь вводит команду, bash ищет программу/скрипт, соответствующую команде, в каталогах, указанных в переменной окружения PATH и запускает ее в случае обнаружения, передавая указанные пользователем параметры, в противном случае выводит сообщение о невозможности/отсутствии выполнения команды.
Файлы параметров:
/etc/profile - глобальные настройки bash (влияют на всю систему)
~/.bash_profile - параметры bash, обрабатываются при входе в систему
~/.bashrc - обрабатываются при запуске дочерней оболочки
~/.bash_logout - обрабатываются при выходе из системы
- Файл ~/.bash_profile часто отсутствует, либо содержит одну строку, указывающую на .bashrc, который стоит считать основным конфигурационным файлом для каждого определенного пользователя (находится в домашнем каталоге (~) пользователя и влияет только на его оболочку), на всех пользователей могут влиять настройки в /etc/profile.
- Файл ~/.bash_history хранит историю команд, введенных пользователем.
В файле .bashrc задаются псевдонимы команды (alias), определяется внешний вид приглашения командной строки, задаются значения переменных окружения.
# псевдонимы команды (замена команды ввода)
alias h='fc -l'
alias ll='ls -laFo'
alias g='egrep -i'
# Переменная PS1 отвечает за внешний вид командной строки
пользователь@компьютер:рабочий_каталог # по умолчанию PS1='\u@\h:\w$'
# модификаторы
\a # ASCII-символ звонка (код 07)
\d # дата в формате "день недели, месяц, число"
\h # имя компьютера до первой точки
\H # полное имя компьютера
\j # количество задач, запущенных в оболочке в данное время
\l # название терминала
\n # символ новой строки
\r # возврат каретки
\s # название оболочки
\t # время в 24-часовом формате (ЧЧ: ММ: СС)
\T # время в 12-часовом формате (ЧЧ: ММ: СС)
\@ # время в 12-часовом формате (am/pm)
\u # имя пользователя
\v # версия bash (сокращенная версия)
\V # версия bash (полная версия: номер релиза, номер патча)
\w # текущий каталог (полный путь)
\W # текущий каталог (только название каталога, без пути)
\! # номер команды в истории
\# # системный номер команды
\$ # если UID пользователя 0 вывод #, иначе $
\\ # обратный слэш
$ ( ) # подстановка внешней команды
PS1=’[\u@\h] $(date +%m/%d/%y) \$’ # пример альтернативного приглашения
export <env> # установить переменную окружения
Автоматизация при помощи скриптов bash (сценарии):
Первой строкой в файле сценария необходимо указать программу для его обработки.
#!/bin/bash
# комментарий
echo "Привет, мир!"
Далее необходимо сохранить сценарий, например, как script и дать возможность выполнения.
chmod +x script # сделаем файл исполняемым
./script # запустим наш сценарий
cp ./script /usr/bin # добавим сценарий в каталог PATH для выполнения по команде
sh scriptname # запуск сценария, либо bash scriptname (не рекомендуется)
# рекомендуется дать права на чтения и на выполнение файла сценария
chmod 555 scriptname # права для любого пользователя
chmod +rx scriptname # права для любого пользователя
chmod u+rx scriptname # права только для владельца сценария
./scriptname # стандартный запуск сценария
# объявление переменной в сценарии
переменная=значение # до и после = не должно быть пробелов
ADDRESS=ww.dkws.org.ru # пример объявления
echo $ADDRESS # использование переменной
read ADDRESS # прочитать с клавиатуры значение переменной
ADDRESS='hostname' # прочитать значение с вывода программы hostname
# переменные окружения: спец. переменные, содержащие служебные данные
BASH # полный путь до файла командной оболочки bash
BASH_VERSION # версия bash
HOME # домашний каталог пользователя, запустившего сценарий
HOSTNAME # имя компьютера
RANDOM # случайное число от 0 до 32767
OSTYPE # тип операционной системы
PWD # текущий каталог
PS1 # строка приглашения
UID # ID пользователя, запустившего сценарий
GID # ID группы пользователя, запустившего сценарий
USER # имя пользователя, запустившего сценарий
# установка собственной переменной окружения
$ADDRESS=www.dkws.org.ru # присваиваем значение
export $ADDRESS # экспортируем переменную
# передача параметров сценарию команда/сценарий параметры
# пример вызова сценария или команды
$0 # содержит имя сценария
$n # содержит значение параметра под номером n
$# # содержит количество переданных параметров
# Анализ параметров на примере case
case "$1" in
start)
# действие при получении параметра start
echo "запустить сетевой сервис"
;;
stop)
# действие при получении параметра stop
echo "остановить сетевой сервис"
;;
*)
# действия в остальных случаях (например, подсказка об использовании сценария)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
# массивы в сценариях
ARRAY[0]=1;
ARRAY[1]=2;
echo $ARRAY[0];
# циклы (for/while/until/select)
# синтаксис цикла for
for переменная in список # при каждой итерации будет присвоен очередной элемент списка
do
команды
done
# пример цикла for
for n in 1 2 3;
do
echo $n;
done # выведет на экран 1 2 3
# синтаксис цикла while (выполнение команд, пока истинно заданное условие)
while условие
do
команды
done
# пример
n=1
while [ $n -lt 4 ]
do
echo "$n "
n=$(( $n+1 ));
done
# условные операторы (if/case)
# синтаксис оператора if (выполнить список команд при истинном условии)
if условие_1 then
команды_1
elif условие_2 then
команды_2
elif условие_N then
команды_N
else
команды_N+1
fi
# условия в if
[ N==10 ] # переменная N=10
[ N!=10 ] # переменная N не равна 10
-lt # меньше
-gt # больше
-le # меньше или равно
-ge # больше или равно
-eq # равно (вместо ==)
[ переменная выражение значение|переменная ] # применение условий
[ $N -lt 10 ] # N меньше 10
[ $N -lt $A ] # N меньше А
# выражения для проверки существования файла/каталога
-e файл # условие истинно, если файл существует
-d каталог # условие истинно, если каталог существует
-x файл # условие истинно, если файл является исполнимым
# синтаксис оператора case
case переменная in
значение_1) команды_1 ;;
...
значение_N) команды_N ;;
*) команды_по_умолчанию ;;
esac
# значения по очереди сравниваются с приведенными в списке, а при совпадении выполняются команды, если совпадений не было, то выполняются команды по умолчанию
# использование функций
имя () { список; }
# пример использования функции
list_txt()
{
echo "Выводим текстовые файлы"
ls *.txt
}