Shell scripting самоучитель: The OpenNet Project: .

Основы BASH. Часть 1 / Хабр

Безусловно, все те кто общается с ОС Linux хоть раз да имели дело(во всяком случае слышали точно) с командной оболочкой BASH. Но BASH не только командная оболочка, это еще и превосходный скриптовый язык программирования.

Цель этой статьи — познакомить поближе юзеров с bash, рассказать про синтаксис, основные приемы и фишки языка, для того чтобы даже обычный пользователь смог быстренько написать простой скрипт для выполнения ежедневной(-недельной, -месячной) рутинной работы или, скажем, «на коленке» наваять скриптик для бэкапа директории.

Введение

BASH

— Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.

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 (удачное завершение работы скрипта)

Результат выполнения скрипта:

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 самого скрипта

Условия


Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В 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 <команда или набор команд возвращающих код возврата(0 или 1)>

then

<если выражение после if истино, то выполняется этот блок>

else

<если выражение после if ложно, тот этот>

В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , 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,(< ) # меньше

-le,(<=) # меньше или равно

-gt,(>) #больше

-ge,(>=) #больше или равно

! #отрицание логического выражения

-a,(&&) #логическое «И»

-o,(||) # логическое «ИЛИ»


С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.

UPD: Исправил некоторые ошибки
UPD: Обновил часть про условия if-then-else

Статьи на unix-admin.su

Краткий учебник по sed.

В дальнейшем будет приведено множество примеров, команд их опций. Используя формат docbook я легко это всё могу привести к красивому варианту, надеюсь вам тоже понравится :-).

На форуме также представлена похожая информация. Здесь текст намного более «прилизан», я не позволял себе писать разные непроверенные вещи, как на форуме. Ну и конечно, формат DOCBOOK не позволяет вам оставлять комментарии, в отличие от форума. Конечно, ничего не помешает мне оставить ссылку на мой форум, где можно написать разные комментарии к этому тексту.

Вот ещё ссылки. Первые две можно набрать в любой Linux системе. Для остальных ссылок потребуется выход в Сеть.

  1. Замечание

    Замечание, небольшое отступление от основного повествования

  2. Предостережение

    Важное замечание: так выделены важные моменты, которые следует понять, запомнить, и учитывать. Выделенное таким образом можно и проигнорировать конечно, только к этому придётся вернутся, т.к. дальнейшее изложение будет без этого непонятно. А обратных ссылок на всё не напасёшься — ССЗБ.

  3. Внимание

    Важное замечание. Обычно связано с опасностью потери данных, порче компьютера, нового 37го, наступления конца света, и прочего.

    Я использую данное выделение в случаях, когда речь идёт о БЕЗОПАСНОСТИ.

    Вообще говоря, sed-скрипты изначально не рекомендуется применять, если речь идёт о «безопасности», однако, у нас просто нет иного выхода: что-же нам применять? Конечно, утилиты вроде su вполне безопасны, с их правами 4711, и с маниакальными проверками, вводит-ли юзер пароль с клавы, или это вовсе не юзер, а злобный скрипт?

    Писать какие-то свои утилиты ещё опаснее (ага, вы эксперт по безопасности? ну я — …. да, немного. За свою жизнь немало покопался в чужом грязном белье — нам, экспертам, без этого никак. .. вот только…)

    Если вы решили написать свою утилиту, вы должны отдавать себе отчёт в том, что ваша утилита может быть взломана. а вот sed не может быть взломана. Если-бы sed сломали, то я-бы об этом знал. А я — не знаю…

    В данном мануале вообще многобукв посвящены именно этой «безопасности». А что делать? Проблема в том, что sed-скрипты выполняются автономно, а значит, мы не можем никак на них повлиять.

    Однако, на них может повлиять злоумышленник.

    Я промолчу про венду. Это просто смешно. Виндоюзверей попросту жалко. Проблема в том, что юзвери в других ОС думают, что они совсем и полностью защищены.

    см. также Изнанка криптоанализа.

    А ещё гляньте здесь: Хранить вечно!

    Я не смогу использовать одинаковые имена. emulek это тоже я, drBatty.

  4. 		Это то, что отображается на экране компьютера. 
    		Используется для записи разных коротких примеров (в одну команду), и прочего.
    					
  5. 		текст программы, скрипта и прочее.
    					
  6. Подсказка

    Это подсказка.

  7. Так выделяются команды.

  8. Так выделяются опции, например для bash-команд это ключи.

Замечание

Сбт Июн 5 19:48:34 MSD 2010 Привинтил спеллчекер, исправил множество очепяток…

Учебное пособие по написанию сценариев оболочки

Купите это руководство по созданию сценариев оболочки в формате PDF всего за 5 долларов США

Цель этого руководства

Это руководство написано, чтобы помочь людям понять некоторые основы оболочки .
скрипт
(он же shell scripting ) и, надеюсь, представить некоторые возможности простого, но
мощное программирование, доступное в оболочке Bourne. Таким образом, было написано как
основой для индивидуальных или групповых занятий и упражнений, а также в качестве справочного материала для последующих
использовать.

Получение самой последней версии этого руководства

Вы читаете Версия 4.4a , последнее обновление 14 января 2023 г. .
Самая последняя версия этого руководства всегда доступна по адресу:
https://www.shellscript.sh.
Всегда проверяйте там последнюю копию. (Если вы читаете это по какому-то другому адресу, вероятно, это копия настоящего сайта и, следовательно, может быть устаревшей).

Краткая история sh

Стив Борн написал оригинальную оболочку Bourne, которая появилась в версии Unix Seventh Edition Bell Labs Research. Со временем появилось и исчезло множество вариантов (csh, ksh и т. д.).
Это руководство ограничивается совместимостью с оболочкой Bourne, чтобы обеспечить основу. В этом руководстве рассматриваются все основы написания сценариев оболочки. Раздел руководства «Примеры сценариев оболочки» содержит дополнительные примеры, в частности того, как оболочка Bash обеспечивает дополнительные полезные функции по сравнению со стандартной оболочкой Bourne.

Аудитория

Этот учебник предполагает некоторый предыдущий опыт; а именно:

  • Использование интерактивной оболочки Unix/Linux
  • Минимальные знания в области программирования — использование переменных, функций, полезные базовые знания
  • Понимание некоторых команд Unix/Linux и компетентность в использовании некоторых из более распространенных . ( LS , CP , ECHO и т. Д.)
  • Программисты Ruby , Perl , Python , C , Pascal , или любой Programming (даже базовый. читать сценарии оболочки,
    но не чувствую, что они точно понимают, как они работают.

Возможно, вы захотите просмотреть некоторые отзывы, которые получило это руководство, чтобы понять, насколько полезным оно может быть для вас.

Типографские обозначения, используемые в этом руководстве

Значимые слова будут курсивом при упоминании
первый раз.

Сегменты кода и выходные данные скрипта будут отображаться как моноширинный текст.
Записям командной строки будет предшествовать знак доллара ($). Если ваше приглашение отличается,
введите команду:

 PS1="$" ; экспорт PS1 

Тогда ваши взаимодействия должны
соответствуют приведенным примерам (например, ./my-script.sh ниже).
Вывод сценария (например, «Hello World» ниже) отображается в начале строки.

 $ echo '#!/bin/sh' > my-script.sh
$ echo 'эхо Hello World' >> my-script.sh
$ chmod 755 my-script.sh
$ ./my-script.sh
Привет, мир
$
 

Целые скрипты будут отображаться на сером фоне и содержать ссылку на обычный текст скрипта, если он доступен:


my-script.sh

 #!/bin/sh
# Это комментарий!
echo Hello World # Это тоже комментарий!
 

Обратите внимание: чтобы сделать файл исполняемым, необходимо установить бит исполняемого файла, а для оболочки
script, бит Readable также должен быть установлен:

 $ chmod a+rx my-script. sh
$ ./my-script.sh
 

Далее: Философия

Книги и электронные книги

Контакты

Вы можете отправить мне письмо с этой формой. Если вы ожидаете ответа, убедитесь, что указанный вами адрес действителен. Не забудьте включить простой дополнительный вопрос в конце формы, чтобы доказать, что вы реальный человек!

Написание начального сценария оболочки

Купите это руководство по написанию сценариев оболочки в формате PDF всего за 5 долларов США

Для нашего первого сценария оболочки мы просто напишем сценарий, который говорит
«Привет, мир». Затем мы постараемся получить больше от Hello World.
больше, чем любой другой учебник, который вы когда-либо читали 🙂
Создайте файл (first.sh) следующим образом:


first.sh

 #!/bin/sh
# Это комментарий!
echo Hello World # Это тоже комментарий!
 

Первая строка сообщает Unix, что файл должен быть выполнен /bin/sh.
Это стандартное расположение оболочки Bourne почти на каждом компьютере.
Юникс система. Если вы используете GNU/Linux, /bin/sh обычно является символической ссылкой на bash (или, в последнее время, на dash).

Вторая строка начинается со специального символа: # . Это отмечает
строку в качестве комментария, и она полностью игнорируется оболочкой.
Единственным исключением является самая первая строка файла
начинается с #! — как у нас. Это специальная директива
к которым Unix относится особенно. Это означает, что даже если вы используете csh,
ksh или что-нибудь еще в качестве вашей интерактивной оболочки, что следует
должны интерпретироваться оболочкой Борна.
Точно так же Perl-скрипт может начинаться со строки
#!/USR/бен/перл
чтобы сообщить вашей интерактивной оболочке, что следующая программа должна быть выполнена
перл. Для программирования оболочки Bourne мы будем придерживаться #!/bin/sh.

Третья строка запускает команду: echo с двумя параметрами или
аргументы — первый "Привет" ; второй "Мир" .
Обратите внимание, что echo автоматически поставит один пробел между своими параметрами.
Символ # по-прежнему обозначает комментарий; # и ничего
следующий за ним игнорируется оболочкой.

теперь запустите chmod 755 first.sh , чтобы сделать текстовый файл исполняемым,
и запустите ./first.sh .
Ваш экран должен выглядеть следующим образом:

 $ chmod 755 first.sh 
$ ./first.sh
Hello World
$

Вы, вероятно, ожидали этого! Можно даже просто запустить:

 $ echo Hello World 
Hello World
$

Теперь давайте внесем несколько изменений.
Во-первых, обратите внимание, что echo ставит ОДИН пробел между своими параметрами.
Поставьте несколько пробелов между «Hello» и «World». Что вы
ожидать, что вывод будет? Как насчет того, чтобы поместить между ними символ TAB?
Как всегда с программированием оболочки, попробуйте и убедитесь.
Результат точно такой же! Вызываем программу echo
с двумя аргументами; это не волнует больше, чем cp
о промежутках между ними.
Теперь снова измените код:

 #!/bin/sh 
# Это комментарий!
echo "Hello      World"       # Это тоже комментарий!

На этот раз сработало. Вы, наверное, тоже этого ожидали, если у вас есть опыт
других языков программирования. Но ключ к пониманию происходящего
с более сложной командой и сценарием оболочки, это понимать и уметь
объяснить: ПОЧЕМУ?
echo теперь вызывается только с ОДНИМ аргументом — строкой
«Привет, мир». Он точно распечатывает это.
Здесь следует понимать, что оболочка анализирует аргументы ПЕРЕД их передачей.
к вызываемой программе. В этом случае он удаляет кавычки, но пропускает
строка как один аргумент.
В качестве последнего примера введите следующий сценарий. Попробуйте предсказать
результат перед запуском:


first2.