Администрируем Linux: скрипты. Bash книга


Администрируем Linux: скрипты | GeekBrains

Unix Shell и все-все-все.

Большинство офисов в России и мире работает под управлением операционной системе Windows, соответственно от системного администратора куда чаще требуются знание оконных инструментов. Но есть и те, кто предпочитает бесплатный дистрибутив, отсутствие «детских» проблем и высокую производительность. Об одном из главных инструментов для системного администратора Linux — командной оболочке Unix shell и её эволюции в bash поговорим далее.

Bash, Ash и Dash

Unix shell впервые появилась в 1977 году в интерпретации Стивена Борна. Это был достаточно сырой продукт, тем не менее ставший стандартом на долгие 10 лет. Сегодня в Linux используется его куда более совершенный наследник — bash (название расшифровывается как «Bourne(born)-again-shell»). Bash вобрал в себя всё лучшее, что происходило в модификациях исходной оболочки, среди которых Korn shell и C shell. 

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

Но прежде, чем мы перейдем к базовым принципам синтаксиса, стоит упомянуть и другие командные оболочки Unix. Уже упомянутый C shell хоть и дожил до наших дней в составе FreeBSD и OpenBSD, никаких существенных преимуществ по сравнению с вариантов 1978 года, кроме Си-образия, не имеет. Dash — схожее с bash решение, но более легковесное и малофункциональные, что делает его привлекательным для компактных машин. Меньше dash есть только ash, в состав которого входят всего 24 команды и 10 опций командной строки. 

Основы скриптостроения

Впрочем, вернёмся к bash, немного познакомившись с основами его функционирования. Основа — встроенные команды, большая часть которых не представляет существенного интереса в отрыве от скрипта, поэтому сразу к ним. Перед тем, как начать исполнение скрипта, необходимо установить конструкции его обработки, а не просто чтения. 

Поможет оператору в этом так называемый shebang, или просто сочетание символов #!. Данную конструкцию необходимо записывать первой же строкой, указав интерпретатор. В нашем случае это bash, соответственно вид её будет примерно такой:

#!/bin/bash

А вот уже дальше можно смело писать скрипт. В целом, вид кода на bash очень похож на Си. Вот взгляните на простой скрипт с циклом вывода названий:

#!/bin/bash

for x in one two three four do    echo "number $x" done

Результатам станем поочерёдный вывод “number one”...“number four”. Или ещё более привычная запись цикла:

for (( i = 0; i < 10; i++ )) do echo -n "$i; " done

Кроме работы с файлами и командами, к вашим услугам немного арифметики, надо лишь заключить выражение в конструкцию $(( )). Например:

echo $(( 100 / 3 ))

Ещё здесь есть задержки (wait), прерывания (break), переключатели (case), функции, гибкие конструкции и много интересного.

Почитать

В интернете вы найдёте немало отличных образовательных статей и форумов, где вас обучат основам взаимодействия с bash, но начать следует с прочтения хрестоматийных книг.

Advanced Bash Scripting Guide — отличная возможность стать экспертом начав с самого нуля. Еще одно отличное обучающее чтиво, правда в этот раз без перевода на русский язык — O’Reilly Bash Cookbook. Если эти книги прочитаны, то обязательно обзаведитесь карманным справочником за авторством  Скотта Граннемана «Linux Phrasebook». Книга, кстати, есть и на русском языке, но это поубавит у вас традиционной линуксовой хардкорности.

Из интернет-ресурсов традиционно посетите хабр. Данная «обучалка» может и не идеально структурирована, зато за две относительно сжатые статьи вы познакомитесь со всеми основными командами и действиями. Есть и другие варианты, например на портале linuxgeeks тоже можно найти массу полезной информации.

Кстати, здесь на GeekBrains тоже есть курс по администрированию на Linux, но это достаточно общий курс, где непосредственно bash изучается всего один урок. Так что описанные выше ссылки для вас точно лишними не будут.

geekbrains.ru

Примеры: bash

Баш - популярный командный интерпритатор.

Самый минимум для нормально программирования на bash:

  • Нужно использовать полные названия опций logger --priority вместо logger -p
  • set -o errexit, set -e - выходит из скрипта при ошибке
  • || true - разрешает команде выполняться с ошибкой
  • set -o nounset, set -u - выходить при обращении к неопределённой переменной
  • echo ${NAME:-bubujka} - значение по умолчанию, если переменная не определена
  • set -o xtrace, set -x - печатать каждую команду что исполняется
  • set -o pipefail - обрывать выполнение если хоть одна команда в пайпе вернула ненулевой статус. mysqldump | gzip
  • Переменные нужно брать в фигурные скобки ls /srv/${ENV}_app

Несколько самых частых хоткеев, которые сильно облегчают работу в bash:

  • alt-b на слово назад
  • alt-f на слово вперёд
  • ctrl-p предыдущая команда
  • ctrl-n следующая команда
  • ctrl-w удалить слово левее
  • ctrl-k удалить до конца строки вправо
  • ctrl-e в конец строки
  • ctrl-a в начало строки

Подавляем stdout и stderr

$ ls /ololo /etc/ &> /dev/null

Проверяем нахождение подстроки в строке

string='My string'; if [[ "$string" == *My* ]] then echo "It's there!"; fi needle='y s' if [[ "$string" == *"$needle"* ]]; then echo "haystack '$string' contains needle '$needle'" fi It's there! haystack 'My string' contains needle 'y s' $ I=foobar $ echo ${I/oo/aa} #replacement faabar $ echo ${I:1:2} #substring oo $ echo ${I%bar} #trailing substitution foo $ echo ${I#foo} #leading substitution bar

Добавить параметры предыдущей команды

$ ls /var/cache/ fontconfig hald ldconfig man pacman $ cd <Alt+.> $ cd /var/cache

Выполнить вторую команду с конца истории

$ ls -l foo bar $ touch foo bar $ !-2

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

$ ls -l foo $ touch !:2 $ cp !:1 bar

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

$ ls -l foo bar $ touch !:2 !:3 $ rm !-2:2 !-2:3 $ !-3

Подставить все аргументы предыдущей команды

$ ls -l foo bar $ ls !*

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

$ ls /tmp /var $ ls !^

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

$ ls /tmp /var $ ls !$

Посмотреть какая команда будет выполнена:

$ ls /var /tmp $ ls !$ <alt+shift+6> $ ls /tmp

Использование случайных чисел

$ echo $((RANDOM % 15))

Проверка строки по регулярному выражению

if [[ "mystring" =~ REGEX ]] ; then echo match fi

Использование массивов

#!/bin/bash array[0]="a string" array[1]="a string with spaces and \"quotation\" marks in it" array[2]="a string with spaces, \"quotation marks\" and (parenthesis) in it" echo "There are ${#array[*]} elements in the array." for n in "${array[@]}"; do echo "element = >>${n}<<" done

Посмотреть как будет выполняться скрипт

$ bash -x script.sh

Исправление ошибок в последней команде

$ cat /proc/cupinfo cat: /proc/cupinfo: No such file or directory $ ^cup^cpu

Использование булевых операторов в выражении

if [ 2 -lt 3 ] then echo "Numbers are still good!" fi if [[ 2 < 3 ]] then echo "Numbers are still good!" fi

Проверить синтаксис скрипта без его выполнения

$ bash -n script.sh

Подсчёт времени потраченного на выполнение

$ SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"

Использование арифметики

if [[ $((2+1)) = $((1+2)) ]] then echo "still ok" fi [[email protected]]$ export PROMPT_COMMAND="date" Fri Jun 5 15:19:18 BST 2009 [[email protected]]$ ls file_a file_b file_c Fri Jun 5 15:19:19 BST 2009 [[email protected]]$ ls

Редактировать текущую команду в редакторе

$ ls -l <ctrl+x><ctrl+e> Поместить курсор в начало/конец строки Ctrl + a / Ctrl + e Поменять местами текущий и предыдущий символ/слово Ctrl + t / Alt + t Поменять в верхний/нижний регистр всё от текущей позиции до конца слова Alt + u / Alt + l

Отчистить файл

$ > file

Использование базовых математических операций.

$ A=10 $ let B="A * 10 + 1" # B=101 $ let B="B / 8" # B=12 $ let B="(RANDOM % 6) + 1" # B от 1 до 6

Первая команда удаляет из истории баша все дубликаты Вторая увеличивает объём истории

$ export HISTCONTROL=erasedups $ export HISTSIZE=1000

Вырубать баш после 15 минут простоя

$ export TMOUT=$((15*60))

Раскрыть подстановки в выражениях

$ rm -r source/d*.c <Alt + *> $ rm -r source/delete_me.c source/do_not_delete_me.c

Развернуть переменные и алиасы

$ ls $HOME/tmp <Ctrl Alt + e> $ ls -N --color=tty -T 0 /home/cramey

Вызывать команды из команд.

$ hostname && dig +short $(hostname) && dig +short -x $(dig +short $(hostname))

Вызывать переменные-переменные

$ foo=bar $ baz=foo $ echo ${!baz} bar

Массивы

array[0]=тест1 array[1]=тест2 echo ${#array[0]} # Длина первого элемента массива echo ${#array[*]} # Число элементов в массиве echo ${#array[@]} # Число элементов в массиве echo ${array[@]:0} # Все элементы массива echo ${array[@]:1} # Все эелементы массива, начиная со 2-го area=( ноль один два три четыре ) a=( '' ) # "a" имеет один пустой элемент hash=( [0]="первый" [1]="второй" [3]="четвертый" )

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

LD_IFS="$IFS" IFS=$'\n' declare -a a a=( $(cat "file.txt") ) echo "Total:" ${#a[@]} for i in "${a[@]}" do echo "$i" done IFS="$OLD_IFS"

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

+ сложение - вычитание * умножение / деление ** возведение в степень % модуль, остаток от деления += -= /= *= %=

Битовые операторы

<< сдвигает на 1 бит влево (умножение на 2) <<= сдвиг-влево-равно >> сдвиг вправо на 1 бит (деление на 2) >>= сдвиг-вправо-равно (имеет смысл обратный <<=) & по-битовое И (AND) &= по-битовое И-равно | по-битовое ИЛИ (OR) |= по-битовое ИЛИ-равно ~ по-битовая инверсия ! по-битовое отрицание ^ по-битовое ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) ^= по-битовое ИСКЛЮЧАЮЩЕЕ-ИЛИ-равно

Логические операторы

&& логическое И (and) || логическое ИЛИ (or)

Длина строки

${#string} expr length $string expr "$string" : '.*'

Длина подстроки в строке

expr match "$string" '$regsubstring' expr "$string" : '$regsubstring'

Специальные переменные

$# количество аргументов командной строки $* и [email protected] содержат все аргументы командной строки $0 $1 $2 ${10} позиционные параметры $? код завершения последней выполненной команды, функции или сценария $$ id процесса $! pid последнего, запущенного в фоне, процесса $_ последний аргумент предыдущей команды

Перенаправление вывода

COMMAND_OUTPUT > # Перенаправление stdout (вывода) в файл. : > filename # Операция > усекает файл "filename" до нулевой длины # (аналог команды touch) > filename # Операция > усекает файл "filename" до нулевой длины COMMAND_OUTPUT >> # Перенаправление stdout (вывода) в файл в режиме добавления 1>filename # Перенаправление вывода (stdout) в файл "filename" 1>>filename # Перенаправление вывода (stdout) в файл "filename", добавление 2>filename # Перенаправление stderr в файл "filename" 2>>filename # Перенаправление stderr в файл "filename", добавление &>filename # Перенаправление stdout и stderr в файл "filename" 2>&1 # Перенаправляется stderr на stdout i>&j # Перенаправляется файл с дескриптором i в j >&j # Перенаправляется файл с дескриптором 1 (stdout) # в файл с дескриптором j 0< FILENAME # Ввод из файла < FILENAME # Ввод из файла

Подавить весь вывод программы

find / > /dev/null 2>&1

Получить расширение файла

ext=${file_name##*.} name=${file_name%.*}

Обрезать пробелы в начале и конце строки

trim() { echo $1; } echo ">>$(trim 'right side ')<<" echo ">>$(trim ' left side')<<" echo ">>$(trim ' both sides ')<<" >>right side<< >>left side<< >>both sides<<

Создать пустой файл или отчистить его содержимое

$ > file.txt

Выбрать все файлы кроме тех что подходят под шаблон

$ shopt extglob extglob off $ ls abar afoo bbar bfoo $ ls !(b*) -bash: !: event not found $ shopt -s extglob #Enables extglob $ ls !(b*) abar afoo $ ls !(a*) bbar bfoo $ ls !(*foo) abar bbar

Итерация по переданным аргументам

for var in "[email protected]" do echo "$var" done

Сопоставляем переменную с шаблоном

if expr "$projectdesc" : "Unnamed repository.*$" >/dev/null then projectdesc="UNNAMED PROJECT" fi

Автоинкремент в bash

$ i=1 $ i=$[i+1] $ echo $i 2

Заменить все вхождения слова в предыдущей команде и выполнить её

$ echo one two one three one one one two one three one one $ !!:gs/one/1 echo 1 two 1 three 1 1 1 two 1 three 1 1

Проверяем колличество переданных аргументов

EXPECTED_ARGS=1 E_BADARGS=65 if [ $# -ne $EXPECTED_ARGS ] then echo "Usage: `basename $0` {arg}" exit $E_BADARGS fi

-----------

najomi.org

Книга "Bash-скрипты, руководство в 11 частях"

Последние комментарии

 
 

Bash-скрипты, руководство в 11 частях

Жанр: Программы Язык: русский Добавил: Admin 3 Сен 17 Проверил: Admin 3 Сен 17 Формат:  FB2 (2143 Kb)  RTF (2436 Kb)  TXT (2150 Kb)  HTML (2158 Kb)  EPUB (2409 Kb)  MOBI (6298 Kb)  

Рейтинг: 0.0/5 (Всего голосов: 0)

Аннотация

Bash-скрипты, руководство в 11 частях

Объявления

Где купить?

Нравится книга? Поделись с друзьями!

Похожие книги

Комментарии к книге "Bash-скрипты, руководство в 11 частях"

Комментарий не найдено
Чтобы оставить комментарий или поставить оценку книге Вам нужно зайти на сайт или зарегистрироваться
 

www.rulit.me

Справочники по Bash | Kubuntu.ru

Название: Linux. Карманный справочникАвтор: Скотт ГраннеманГод: 2008Страниц: 417Язык: русскийФормат: djvuРазмер: 2,6 Мб (добавлено 5% на восстановление)

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

http://depositfiles.com/files/8327378

Название: Linux: основные команды. Карманный справочникАвтор: Баррет Д. Дж.Год: 2007Страниц: 288Формат: PDFРазмер: 1.6 MB

Карманный справочник Linux — это одновременно и краткий справочник дня опытных пользователей, и руководство для новичков.Книга предваряется общими сведениями об операционной системе и способах работы в ней. В ней рассматриваются такие основные понятия, как: файлы и директории, командный процессор shell, система X Window. Затем приводится подробное описание команд и программ Linux, покрывающих почти весь спектр прикладных задач, возникающих перед пользователем. Также для команд приведена информация об их местоположении на диске и о принадлежности программным пакетам. Там, где это необходимо, приведены примеры использования. Для удобства применения справочника команды собраны по темам.В конце книги приведены указатель терминов и предметный указатель.

http://depositfiles.com/files/6581312

Linux справочникосновные команды Linux, доступные в любом дистрибутиве системы. Здесь вы найдете полноценный справочный материал по пользовательским командам, инструментам программирования, администрирования и работыс сетью.

http://depositfiles.com/files/5427041

Искусство программирования на языке сценариев командной оболочкиДанное руководство не предполагает наличие у читателя познаний в области программирования на языке сценариев, однако, быстро восполняет этот недостаток . . . постепенно, шаг за шагом раскрывая мудрость и красоту UNIX. Это руководство может рассматриваться как учебник, предназначенный для самостоятельного изучения или как справочник по программированию на shell. Руководство снабжено серией хорошо прокомментированных примеров, поскольку лучший путь к изучению языка сценариев -- это написание сценариев.Искусство написания Bash-скриптов.

kubuntu.ru