В каждой ОС существуют различные командные оболочки (shell), их назначение одинаково (администрирование, автоматизация, вычисления, мониторинг и т.д.). BASH это не сам скриптовой язык, это надстройка на языком SH, которая просто расширяет его функционал, добавляя такие плюшечки как диалоговые окна, чекбоксы, прогрессбары и т.д. На bash (sh) можно даже написать какую нибудь простенькую математическую задачку, но это глупо и неэффективно. Bash это скриптовой язык исключительно для автоматизации выполнения рутинных задач и нужен он исключительно системным администраторам.
Начнем с того, что все скрипты начинаются с одной и той-же строки:
#!/bin/bash
это заголовок, он должен присутствовать в каждом скрипте. Ниже пример самого простого скрипта:
#!/bin/bash # # # Это просто для показа # Запуск: ./hello clear echo hello world # печатаем привет мир exit 0
Как мы видим, строки ЗА решеткой, считаются комментариями. В конце скрипта я включил инструкцию exit 0. Оператор выхода сообщает родительской оболочке, был ли сценарий успешным. Полезно знать, что вы можете работать с exit, чтобы сообщить родительской оболочке, как все прошло.
Введённая в родительской оболочке, команда echo $? позволяет запросить состояние выхода последнего запущенного сценария.
При запуске скрипта можно использовать аргументы. Аргумент — это всё, что вы помещаете за командой сценария. Аргументы могут быть использованы для того, чтобы сделать скрипт более гибким. В тексте сценария первый аргумент обозначается $1, второй аргумент — $2 и т. д.
#!/bin/bash echo The first argument is $1 echo The second argument is $2 echo The third argument is $3
Под параметрами подразумевается ввод данных перед запуском скрипта. В этом примере есть один недостаток — в нем выводятся ровно три аргумента. Если вы введете больше, или меньше — часть данных будет потеряна. Правильнее сделать так:
#!/bin/bash
echo you have entered $# arguments
for i in $@
do
echo $i
done
exit 0
- $# — это счетчик, который показывает, сколько аргументов было использовано при запуске скрипта.
- $@ — список всех аргументов, которые использовались при запуске скрипта.
Переменные…. им можно присваивать различные значения
- Используйте ключевое слово read в скрипте, чтобы запросить данные у пользователя, запускающего скрипт и присвоить их какой либо переменной.
- Используйте подстановку команд, чтобы использовать результат команды и назначить его переменной. Например, команда date +%d-%m-%y показывает текущую дату в формате день-месяц-год. Чтобы сделать это в сценарии, вы можете использовать переменную TODAY=$(date +%d-%m-%y). Для подстановки команд вам просто нужно поместить команду, результат которой вы хотите использовать, между скобками.
#!/bin/bash
if [ -z $1 ]; then
echo enter a text
read TEXT
else
TEXT=$1
fi
echo вы ввели $TEXT
exit 0
В bash есть несколько условных операторов и циклов, которые часто используются.
- if… then… else — используется для выполнения кода, если определенное условие выполняется
- for — используется для выполнения команд для диапазона значений
- while — используется для выполнения кода, если выполняется определенное условие
- before — используется для выполнения кода, пока не выполнено определенное условие
- case — используется для оценки ограниченного количества конкретных значений
#!/bin/bash
# if... then... else...
if [ -f $1 ]
then
echo "$1 is a file"
elif [ -d $1 ]
then
echo "$1 is a directory"
else
echo "I do not know what \$1 is"
fi
exit 0
#!/bin/bash
# for...
for (( COUNTER=100; COUNTER>1; COUNTER-- )); do
echo $COUNTER
done
exit 0
оператор case
В операторе case вы определяете каждый ожидаемый вами конкретный аргумент, за которым следует команда, которую необходимо выполнить, если этот аргумент использовался.
ниже вы можете увидеть работу оператора case, который использовался в ранней версии для запуска практически любой службы.
case "$1" in
start)
start;;
stop)
rm -f $lockfile
stop;;
restart)
restart;;
reload)
reload;;
status)
status
;;
*)
echo "Usage: $0 (start|stop|restart|reload|status)"
;;
esac
ну а теперь, небольшой практический пример
#!/bin/bash #указываем где у нас хранится bash-интерпретатор parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скрипта script_name=$0 #присваиваем переменной script_name значение имени скрипта echo "Вы запустили скрипт с именем $script_name и параметром $parametr1" # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной. echo 'Вы запустили скрипт с именем $script_name и параметром $parametr1' # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных. exit 0 #Выход с кодом 0 (удачное завершение работы скрипта)
результат
ite@ite-desktop:~$ ./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 самого скрипта