Сценарий это linux

Bash-скрипты: начало Bash-скрипты, часть 2: циклы Bash-скрипты, часть 3: параметры и ключи командной строки Bash-скрипты, часть 4: ввод и вывод Bash-скрипты, ча...

Bash-скрипты: начало
Bash-скрипты, часть 2: циклы
Bash-скрипты, часть 3: параметры и ключи командной строки
Bash-скрипты, часть 4: ввод и вывод
Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
Bash-скрипты, часть 6: функции и разработка библиотек
Bash-скрипты, часть 7: sed и обработка текстов
Bash-скрипты, часть 8: язык обработки данных awk
Bash-скрипты, часть 9: регулярные выражения
Bash-скрипты, часть 10: практические примеры
Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

Сегодня поговорим о bash-скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux.

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

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

pwd ; whoami

На самом деле, если вы опробовали это в своём терминале, ваш первый bash-скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd выводит на экран сведения о текущей рабочей директории, потом команда whoamiпоказывает данные о пользователе, под которым вы вошли в систему.

Используя подобный подход, вы можете совмещать сколько угодно команд в одной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды:

getconf ARG_MAX

Командная строка — отличный инструмент, но команды в неё приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения? Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки.

Как устроены bash-скрипты

Создайте пустой файл с использованием команды touch. В его первой строке нужно указать, какую именно оболочку мы собираемся использовать. Нас интересует bash, поэтому первая строка файла будет такой:

#!/bin/bash

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

Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит:

#!/bin/bash
# This is a comment
pwd
whoami

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

Установка разрешений для файла сценария

Сохраните файл, дав ему имя myscript, и работа по созданию bash-скрипта почти закончена. Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied.

Попытка запуска файла сценария с неправильно настроенными разрешениями

Сделаем файл исполняемым:

chmod +x ./myscript

Теперь попытаемся его выполнить:

./myscript

После настройки разрешений всё работает как надо.

Успешный запуск bash-скрипта

Вывод сообщений

Для вывода текста в консоль Linux применяется команда echo. Воспользуемся знанием этого факта и отредактируем наш скрипт, добавив пояснения к данным, которые выводят уже имеющиеся в нём команды:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

Вот что получится после запуска обновлённого скрипта.

Вывод сообщений из скрипта

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

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

Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами.

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

Существуют два типа переменных, которые можно использовать в bash-скриптах:

  • Переменные среды
  • Пользовательские переменные

Переменные среды

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

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Обратите внимание на то, что мы можем использовать системную переменную $HOME в двойных кавычках, это не помешает системе её распознать. Вот что получится, если выполнить вышеприведённый сценарий.

Использование переменной среды в сценарии

А что если надо вывести на экран значок доллара? Попробуем так:

echo "I have $1 in my pocket"

Система обнаружит знак доллара в строке, ограниченной кавычками, и решит, что мы сослались на переменную. Скрипт попытается вывести на экран значение неопределённой переменной $1. Это не то, что нам нужно. Что делать?

В подобной ситуации поможет использование управляющего символа, обратной косой черты, перед знаком доллара:

echo "I have $1 in my pocket"

Теперь сценарий выведет именно то, что ожидается.

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

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

В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.

Как и в случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара:

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

Вот что получится после запуска такого сценария.

Пользовательские переменные в сценарии

Подстановка команд

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

Сделать это можно двумя способами.

  • С помощью значка обратного апострофа «`»
  • С помощью конструкции $()

Используя первый подход, проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка:

mydir=`pwd`

При втором подходе то же самое записывают так:

mydir=$(pwd)

А скрипт, в итоге, может выглядеть так:

#!/bin/bash
mydir=$(pwd)
echo $mydir

В ходе его работы вывод команды pwdбудет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль.

Скрипт, сохраняющий результаты работы команды в переменной

Математические операции

Для выполнения математических операций в файле скрипта можно использовать конструкцию вида $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Математические операции в сценарии

Управляющая конструкция if-then

В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит так:

if команда
then
команды
fi

А вот рабочий пример:

#!/bin/bash
if pwd
then
echo "It works"
fi

В данном случае, если выполнение команды pwdзавершится успешно, в консоль будет выведен текст «it works».

Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd, и если найти его удалось, сообщить о том, что он существует.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

Вот что получается после запуска этого скрипта.

Поиск пользователя

Здесь мы воспользовались командой grepдля поиска пользователя в файле /etc/passwd. Если команда grepвам незнакома, её описание можно найти здесь.

В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось? В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нам и об этом, поэтому усовершенствуем код.

Управляющая конструкция if-then-else

Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else. Вот как она устроена:

if команда
then
команды
else
команды
fi

Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else.

Напишем такой скрипт:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Его исполнение пошло по ветке else.

Запуск скрипта с конструкцией if-then-else

Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так:

if команда1
then
команды
elif команда2
then
команды
fi

Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then, иначе, если первое условие окажется ложным, и если вторая команда вернёт ноль, выполнится второй блок кода.

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

В подобном скрипте можно, например, создавать нового пользователя с помощью команды useradd, если поиск не дал результатов, или делать ещё что-нибудь полезное.

Сравнение чисел

В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.

n1 -eq n2Возвращает истинное значение, если n1 равно n2.
n1 -ge n2 Возвращает истинное значение, если n1больше или равно n2.
n1 -gt n2Возвращает истинное значение, если n1 больше n2.
n1 -le n2Возвращает истинное значение, если n1меньше или равно n2.
n1 -lt n2Возвращает истинное значение, если n1 меньше n2.
n1 -ne n2Возвращает истинное значение, если n1не равно n2.

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

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

Вот что выведет эта команда.

Сравнение чисел в скриптах

Значение переменной val1больше чем 5, в итоге выполняется ветвь thenоператора сравнения и в консоль выводится соответствующее сообщение.

Сравнение строк

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

str1 = str2 Проверяет строки на равенство, возвращает истину, если строки идентичны.
str1 != str2Возвращает истину, если строки не идентичны.
str1 < str2Возвращает истину, если str1меньше, чем str2.
str1 > str2 Возвращает истину, если str1больше, чем str2.
-n str1 Возвращает истину, если длина str1больше нуля.
-z str1Возвращает истину, если длина str1равна нулю.

Вот пример сравнения строк в сценарии:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

В результате выполнения скрипта получим следующее.

Сравнение строк в скриптах

Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и «<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>» как команду перенаправления вывода.

Вот как работа с этими операторами выглядит в коде:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Вот результаты работы скрипта.

Сравнение строк, выведенное предупреждение

Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение:

./myscript: line 5: [: too many arguments

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

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Теперь всё работает как надо.

Сравнение строк

Ещё одна особенность операторов «>» и «<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks
likegeeks

Сохраним его, дав имя myfile, после чего выполним в терминале такую команду:

sort myfile

Она отсортирует строки из файла так:

likegeeks
Likegeeks

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

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной.

Команда sort и сравнение строк в файле сценария

В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения ASCII-кодов символов, порядок сортировки, таким образом, зависит от кодов символов.

Команда sort, в свою очередь, использует порядок сортировки, заданный в настройках системного языка.

Проверки файлов

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

-d fileПроверяет, существует ли файл, и является ли он директорией.
-e fileПроверяет, существует ли файл.
-f file Проверяет, существует ли файл, и является ли он файлом.
-r fileПроверяет, существует ли файл, и доступен ли он для чтения.
-s file Проверяет, существует ли файл, и не является ли он пустым.
-w fileПроверяет, существует ли файл, и доступен ли он для записи.
-x fileПроверяет, существует ли файл, и является ли он исполняемым.
file1 -nt file2 Проверяет, новее ли file1, чем file2.
file1 -ot file2Проверяет, старше ли file1, чем file2.
-O file Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.
-G fileПроверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя.

Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки.

Опробуем одну из команд на практике:

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

Этот скрипт, для существующей директории, выведет её содержимое.

Вывод содержимого директории

Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются по тому же принципу.

Итоги

Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.

  1. Bash Script Step By Step — здесь речь идёт о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.
  2. Bash Scripting Part 2, Bash the awesome — тут раскрываются особенности работы с циклами for и while.
  3. Bash Scripting Part 3, Parameters & options — этот материал посвящён параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь, и которые можно читать из файлов.
  4. Bash Scripting Part 4, Input & Output — здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода, вывода, ошибок, о перенаправлении вывода.
  5. Bash Scripting Part 5, Sighals & Jobs — этот материал посвящён сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.
  6. Bash Scripting Part 6, Functions — тут можно узнать о создании и использовании функций в скриптах, о разработке библиотек.
  7. Bash Scripting Part 7, Using sed — эта статья посвящена работе с потоковым текстовым редактором sed.
  8. Bash Scripting Part 8, Using awk — данный материал посвящён программированию на языке обработки данных awk.
  9. Bash Scripting Part 9, Regular Expressions — тут можно почитать об использовании регулярных выражений в bash-скриптах.
  10. Bash Scripting Part 10, Practical Examples — здесь приведены приёмы работы с сообщениями, которые можно отправлять пользователям, а так же методика мониторинга диска.
  11. Bash Scripting Part 11, Expect Command — этот материал посвящён средству Expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об expect-скриптах и об их взаимодействии с bash-скриптами и другими программами.

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

Уважаемые читатели! Просим гуру bash-программирования рассказать о том, как они добрались до вершин мастерства, поделиться секретами, а от тех, кто только что написал свой первый скрипт, ждём впечатлений.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Переводить остальные части цикла статей?

Проголосовали 1527 пользователей.

Воздержались 124 пользователя.

Фундаментальные основы Linux. Часть VI. Сценарии

Оригинал:

Linux Fundamentals

Автор: Paul Cobbaut

Дата публикации: 16 октября 2014 г.

Перевод: А.Панин

Дата перевода: 21 декабря 2014 г.

Глава 21. Введение в разработку сценариев

Командные оболочки, такие, как bash и Korn shell поддерживают программные конструкции, которые могут быть сохранены в форме сценариев. Эти сценарии, в свою очередь, впоследствии могут использоваться в качестве реализаций дополнительных команд командной оболочки. Многие команды Linux реализованы в форме сценариев. Например, сценарии для обслуживания профиля пользователя исполняются при входе пользователя в систему, а сценарии инициализации — при остановке и запуске демона.

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

Целью данной главы является предоставление достаточной информации для того, чтобы вы могли читать и понимать сценарии. Для этого вам совершенно не нужно становиться разработчиком сложных сценариев.

Предварительное чтение

Перед тем, как приступить к чтению данной главы, вам необходимо прочитать и понять главы из Части III. "Раскрытие команд командной оболочкой" и Части IV. "Программные каналы и команды".

Hello world

По аналогии с практически любым курсом по программированию, мы начнем работу с разработки сценария hello_world. Следующий сценарий будет выводить строку Hello World.

echo Hello World

После создания этого простого сценария в редакторе vi или с помощью команды echo вам придется выполнить команду chmod +x hello_world для того, чтобы сделать файл сценария исполняемым. В том случае, если вы не будете добавлять путь к директории с вашими сценариями в список директорий из переменной окружения PATH, вам придется вводить полный путь к сценарию для того, чтобы командная оболочка смогла найти его.

[paul@RHEL4a ~]$ echo echo Hello World > hello_world
[paul@RHEL4a ~]$ chmod +x hello_world 
[paul@RHEL4a ~]$ ./hello_world 
Hello World
[paul@RHEL4a ~]$

She-bang

Давайте немного доработаем наш пример, разместив строку #!/bin/bash в начале сценария. Последовательность символов #! называется she-bang (или иногда sha-bang), причем слово she-bang составлено из названий двух первых символов сценария.

#!/bin/bash
echo Hello World

Вы ни при каких обстоятельствах не можете быть уверены в том, какая командная оболочка используется в системе пользователя. Сценарий, превосходно работающий в командной оболочке bash, может не работать в командных оболочках ksh, csh или dash. Для того, чтобы проинструктировать командную оболочку о необходимости запуска вашего сценария в определенной командной оболочке, вы должны начинать ваш сценарий с последовательности символов she-bang, после которой должен располагаться путь к бинарному файлу командной оболочки, в которой сценарий должен исполняться. Приведенный ниже сценарий будет исполняться в командной оболочке bash.

#!/bin/bash
echo -n hello
echo Дочерняя командная оболочка bash `echo -n hello`

А этот сценарий будет исполняться в командной оболочке Korn shell (за исключением тех случаев, когда по пути /bin/ksh расположена жесткая ссылка на бинарный файл /bin/bash). Файл /etc/shells содержит список путей к командным оболочкам, установленным в вашей системе.

#!/bin/ksh
echo -n hello
echo Дочерняя командная оболочка Korn shell `echo -n hello`

Комментарий

Давайте еще немного усовершенствуем наш пример, добавив строки комментариев.

#!/bin/bash
#
# Сценарий Hello World
#
echo Hello World

Переменные

Ниже приведен простой пример объявления переменной в сценарии.

#!/bin/bash
#
# простая переменная в сценарии
#
var1=4
echo var1 = $var1

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

[paul@RHEL4a ~]$ echo $var1

[paul@RHEL4a ~]$ ./vars
var1 = 4
[paul@RHEL4a ~]$ echo $var1

[paul@RHEL4a ~]$

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

К счастью, у вас имеется возможность исполнения сценария в той же рабочей командной оболочке; данная техника называется использованием рабочей командной оболочки (sourcing a script).

[paul@RHEL4a ~]$ source ./vars
var1 = 4
[paul@RHEL4a ~]$ echo $var1
4
[paul@RHEL4a ~]$

Представленная выше команда аналогична следующей команде.

[paul@RHEL4a ~]$ . ./vars
var1 = 4
[paul@RHEL4a ~]$ echo $var1
4
[paul@RHEL4a ~]$ 

Отладка сценария

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

paul@debian6~/test$ bash runme
42

Дополнение данной команды до формы bash -x позволит вам ознакомиться со всеми командами, исполняемыми командной оболочкой (после раскрытия команд).

paul@debian6~/test$ bash -x runme
+ var4=42
+ echo 42
42
paul@debian6~/test$ cat runme
# сценарий runme
var4=42
echo $var4
paul@debian6~/test$

Обратите внимание на отсутствие строки комментария (первым символом которой является символ #), а также замену значения переменной перед исполнением команды для вывода данных echo.

Предотвращение подмены имен файлов сценариев с целью повышения привилегий в системе

Какой-либо пользователь может попытаться выполнить сценарий с установленным битом setuid с целью повышения привилегий в системе, подменив имя файла этого сценария путем создания ссылки на него (root spoofing). Это довольно редкая, но возможная атака. Для повышения безопасности функционирования вашего сценария, а также для предотвращения подмены имен файлов сценариев, вам необходимо добавить после строки #!/bin/bash параметр --, который позволит деактивировать механизм обработки параметров, благодаря чему командная оболочка не примет дополнительных параметров.

#!/bin/bash -
или
#!/bin/bash --

Любые аргументы, расположенные после последовательности символов -- будут рассматриваться как имена файлов и аргументы. Аргумент - эквивалентен аргументу --.

Практическое задание: введение в разработку сценариев

0. Используйте различные имена для файлов ваших сценариев и сохраните их на будущее!

1. Создайте сценарий, который выводит имя города.

2. Сделайте так, чтобы сценарий исполнялся в командной оболочке bash.

3. Сделайте так, чтобы сценарий исполнялся в командной оболочке Korn shell.

4. Создайте сценарий, в котором осуществляется объявление двух переменных с последующим выводом их значений.

5. Предыдущий сценарий не должен оказывать воздействия на вашу рабочую командную оболочку (объявленные в нем переменные не будут существовать вне сценария). А теперь запустите сценарий таким образом, чтобы он оказал влияние на вашу рабочую командную оболочку.

6. Существует ли более короткая форма команды для использования рабочей командной оболочки с целью исполнении сценария?

7. Добавьте комментарии в ваши сценарии для того, чтобы знать о выполняемых ими операциях.

Корректная процедура выполнения практического задания: введение в разработку сценариев

0. Используйте различные имена для файлов ваших сценариев и сохраните их на будущее!

1. Создайте сценарий, который выводит имя города.

$ echo 'echo Antwerp' > first.bash
$ chmod +x first.bash 
$ ./first.bash 
Antwerp

2. Сделайте так, чтобы сценарий исполнялся в командной оболочке bash.

$ cat first.bash
#!/bin/bash
echo Antwerp

3. Сделайте так, чтобы сценарий исполнялся в командной оболочке Korn shell.

$ cat first.bash
#!/bin/ksh
echo Antwerp

Обратите внимание на то, что хотя данный сценарий и будет технически исполняться как сценарий командной оболочки Korn shell, расширение файла .bash может смутить пользователя.

4. Создайте сценарий, в котором осуществляется объявление двух переменных с последующим выводом их значений.

$ cat second.bash
#!/bin/bash

var33=300
var42=400

echo $var33 $var42

5. Предыдущий сценарий не должен оказывать воздействия на вашу рабочую командную оболочку (объявленные в нем переменные не будут существовать вне сценария). А теперь запустите сценарий таким образом, чтобы он оказал влияние на вашу рабочую командную оболочку.

6. Существует ли более короткая форма команды для использования рабочей командной оболочки с целью исполнении сценария?

7. Добавьте комментарии в ваши сценарии для того, чтобы знать о выполняемых ими операциях.

$ cat second.bash
#!/bin/bash
# сценарий для проверки работы механизма использования рабочей командной оболочки

# объявление двух переменных
var33=300
var42=400

# вывод значений этих переменных
echo $var33 $var42


Если вам понравилась статья, поделитесь ею с друзьями:


Прежде всего давайте разберём, что такое script и для чего он нужен.

Script в переводе с английского — сценарий. Все мы смотрим фильмы, многие из нас — спектакли. Чтобы создать фильм/спектакль, сценаристы пишут к ним сценарии, на основании которых артисты, сценка за сценкой исполняют на сцене свои роли, из чего и складывается фильм/спектакль. Работа по созданию сценария довольно кропотливая, где нужно учесть всё до мелочей, чтобы в конечном итоге артисты могли выполнить задуманное сценаристом, а зритель увидел целостное произведение.

Подобным же образом пишутся скрипты для выполнения списка задач, которые пользователь составляет вместе (код), чтобы сделать их выполнение проще и быстрее в операционной системе. Для написания простых скриптов совсем не обязательно иметь образование программиста.

Для начала давайте создадим самый, что ни на есть, простейший скрипт-Shell для обновления системы.

Все действия я буду проводить с системе Ubuntu, но они применимы и к другим системам Linux, производных от Ubuntu. Для этого нам понадобятся: Текстовый редактор, чтобы наполнить его нужными задачами для создания скрипта (кода) и Терминал — для выполнения созданного скрипта. Эти инструменты установлены в любом дистрибутие Linux по умолчанию.

Итак, открываем текстовый редактор Gedit и вводим в него первые обязательные символы под названием shebang.
shebang в программировании, это последовательность из двух символов: решётки и восклицательного знака (#!) в начале файла скрипта. И добавляем к данным символам без пробелов /bin/sh — интерпретатор, где будет выполняться скрипт. /bin/sh — это обычно Bourne shell или совместимый интерпретатор командной строки, который передаёт «path/to/script» как первый параметр.
Первая обязательная строка скрипта будет выглядеть следующим образом:

#!/bin/sh

Далее, следующей строкой следует описание того, что должен выполнить наш первый скрипт/сценарий:

# Мой первый Script обновления Ubuntu

Знак решётки (#) в самом начале строки даёт понять интерпретатору/терминалу, что эту строку читать и выполнять не нужно. Строка нужна в коде данного скрипта для того чтобы сам создатель скрипта знал, что он собирается выполнить на данном отрезке/сценке в коде, чтобы не запутаться в дальнейшем, когда таких строк будет много. Такие строки с знаком решётки называются —

закомментированные

.

Далее в скрипте следуют выполняемые строки с командами, в данном случае для обновления системы Ubuntu:

sudo apt update
sudo apt upgrade -y

-y в конце второй команды даёт понять интерпретатору/терминалу, что это действие/команду нужно выполнить автоматически, без дополнительного подтверждения пользователем, нажатия  клавиши Ввод. y — сокращённо от английского yes, т.е. да.

Вот и всё. Ваш первый скрипт создан. У вас должно получиться как на снимке:

Остаётся сохранить созданный файл/скрипт и дать ему Имя с обязательным расширением в конце — .sh. Расширение .sh присваивается исполняемому файлу.
Я дал ему Имяобновление.sh, сохранив в Домашней папке пользователя:

Для того чтобы созданный файл/скрипт был исполняемый, ему нужно дать на это разрешение. Сделать это можно двумя способами.

1. Выполнить следующую команду в терминале:


sudo chmod +x обновление.sh

2. Либо открыть  файловый менеджер в Домашней папке (где вы сохранили созданный скрипт), правый клик на файле, в контекстном меню — Свойства — Права и активировать пункт — Выполнение: Разрешить выполнение файла как программы:

Чтобы выполнить созданный скрипт, нужно открыть терминал ( о чём я писал в самом начале статьи, что терминал — необходимый атрибут/инструмент для выполнения скрипта), ввести sh, через пробел название скрипта — обновление.sh и нажать клавишу Ввод:

Либо в терминале вводим sh и перетаскиваем из файлового менеджера созданный файл с скриптом (также через пробел):

После того как путь к файлу отобразится после команды sh и пробела, достаточно нажать клавишу Enter (Ввод), чтобы выполнить обновление системы:

Теперь в любой момент вы можете сделать обновление системы созданным собственным скриптом.

Да, кто-то может возразить, что обновление системы не сложно сделать выполнением этих двух команд в терминале, зачем пыжиться и создавать какие-то скрипты? Всё верно. Но это пример создания простейшего скрипта, чтобы показать, что «не боги горшки обжигают» 😃.

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

Многие из вас, скорее всего, пользуются сайтами по настройке системы, типа тех что я публикую после выхода очередного релиза UbuntuUbuntu после установки или подобными сайтами. Откройте один из таких сайтов: http://compizomania.blogspot.com/2016/04/ubuntu-1604.html, затем текстовый редактор для создания скрипта.
Для примера я сделал следующую заготовку.

В текстовом редакторе вводим первую обязательную строку:

#!/bin/bash

Далее закомментированные строки с описанием:

# Настройка Ubuntu после уставновки
# Обновление системы

Ниже следуют команды обновления системы:

sudo apt update
sudo apt upgrade -y

Строка описания: Добавление репозиториев:

# Добавление репозиториев

И добавляете необходимые репозитории для дальнейшей установки программного обеспечения:

sudo add-apt-repository «deb http://archive.canonical.com/ $(lsb_release -sc) partner» -y
sudo add-apt-repository ppa:atareao/telegram -y
sudo add-apt-repository ppa:atareao/atareao -y

sudo add-apt-repository ppa:nemh/systemback -y
sudo add-apt-repository ppa:gerardpuig/ppa -y
sudo add-apt-repository ppa:haecker-felix/gradio-daily -y

После того как необходимые репозитории добавлены (повторюсь, у вас могут быть свои репозитории, у меня пример), необходимо обновить систему:

Строка с описанием:

# Обновление системы после подключения репозиториев

И команда на выполнение:

sudo apt update

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

# Установка программ

Для установки программ достаточно один раз ввести команду sudo apt install, а затем через пробел в данную строку добавлять сколько угодно программ, главное чтобы они были правильно составлены. Если какая-то программа состоит из нескольких слов, её команда должна быть монолитной, т.е. все слова в ней должны вводится через чёрточку, например: unity-tweak-tool:

sudo apt install my-weather-indicator telegram skype lm-sensors hddtemp psensor gdebi systemback unity-tweak-tool ubuntu-cleaner gradio -y

Установка дополнительных кодеков

# Мультимедиа и кодеки

sudo apt install ubuntu-restricted-extras -y

Отключение о сбоях в системе

# Отключить отчёты о сбоях в системе

sudo sed -i «s/enabled=1/enabled=0/g» ‘/etc/default/apport’

Ну вот, пожалуй, и всё. Данный созданный файл сценария должен выглядеть следующим образом:

Необходимо сохранить его (нажать кнопку Сохранить) и дать Имя с расширением .sh. Я назвал его Настройка Ubuntu.sh (вы можете назвать по-другому, но обязвтельно с расширением .sh):

Делаем созданный скрипт исполняемым:

sudo chmod +x Настройка Ubuntu.sh

Для выполнения созданного скрипта введите в терминале sh и название созданного скрипта через пробел, либо sh, пробел и перетащить в терминал созданный файл, как объяснялось ранее в простейшем скрипте и нажмите клавишу Ввод, для его выполнения.

Примечание. Обратный слэш в команде Настройка Ubuntu.sh экранирует пробел в названии файла для терминала между двумя отдельными словами.

После того как скрипт будет выполнен, хранить его на будущее, для возможной переустановки системы и повторной настройки, лучше всего на отдельном разделе ж/диска в папке /home. Если таковой нет, то в облачном сервисе (Облачное хранилище данных) типа:  DropBox, Облако Mail.Ru, Mega.co и т.п., чтобы в любой момент воспользоваться скриптом самому, либо помочь знакомым или родственникам в настройке системы.

Удачи.

Каким бы простым ни был графический интерфейс в Linux и сколько бы там ни было функций, все равно есть задачи, которые удобнее решать через терминал. Во-первых, потому что это быстрее, во-вторых — не на всех машинах есть графический интерфейс, например, на серверах все действия выполняются через терминал, в целях экономии вычислительных ресурсов.

Если вы уже более опытный пользователь, то, наверное, часто выполняете различные задачи через терминал. Часто встречаются задачи, для которых нужно выполнять несколько команд по очереди, например, для обновления системы необходимо сначала выполнить обновление репозиториев, а уже затем скачать новые версии пакетов. Это только пример и таких действий очень много, даже взять резервное копирование и загрузку скопированных файлов на удаленный сервер. Поэтому, чтобы не набирать одни и те же команды несколько раз можно использовать скрипты. В этой статье мы рассмотрим написание скриптов на Bash, рассмотрим основные операторы, а также то как они работают, так сказать, bash скрипты с нуля.

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

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

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

Простейший пример скрипта для командной оболочки Bash:

#!/bin/bash
echo "Hello world"

bash1

Утилита echo выводит строку, переданную ей в параметре на экран. Первая строка особая, она задает программу, которая будет выполнять команды. Вообще говоря, мы можем создать скрипт на любом другом языке программирования и указать нужный интерпретатор, например, на python:

#!/usr/bin/env python
print("Hello world")

Или на PHP:

#!/usr/bin/env php
echo "Hello world";

В первом случае мы прямо указали на программу, которая будет выполнять команды, в двух следующих мы не знаем точный адрес программы, поэтому просим утилиту env найти ее по имени и запустить. Такой подход используется во многих скриптах. Но это еще не все. В системе Linux, чтобы система могла выполнить скрипт, нужно установить на файл с ним флаг исполняемый.

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

Чтобы сделать файл исполняемым в linux выполните:

chmod ugo+x файл_скрипта

Теперь выполняем нашу небольшую первую программу:

./файл_скрипта

bash

Все работает. Вы уже знаете как написать маленький скрипт, скажем для обновления. Как видите, скрипты содержат те же команды, что и выполняются в терминале, их писать очень просто. Но теперь мы немного усложним задачу. Поскольку скрипт, это программа, ему нужно самому принимать некоторые решения, хранить результаты выполнения команд и выполнять циклы. Все это позволяет делать оболочка Bash. Правда, тут все намного сложнее. Начнем с простого.

Переменные в скриптах

Написание скриптов на Bash редко обходится без сохранения временных данных, а значит создания переменных. Без переменных не обходится ни один язык программирования и наш примитивный язык командной оболочки тоже.

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

Например, объявим переменную string:

string="Hello world"

Значение нашей строки в кавычках. Но на самом деле кавычки не всегда нужны. Здесь сохраняется главный принцип bash — пробел — это специальный символ, разделитель, поэтому если не использовать кавычки world уже будет считаться отдельной командой, по той же причине мы не ставим пробелов перед и после знака равно.

Чтобы вывести значение переменной используется символ $. Например:

echo $string

Модифицируем наш скрипт:

#!/bin/bash
string1="hello "
string2=world
string=$string1$string2
echo $string

И проверяем:

./script

Hello world

Bash не различает типов переменных так, как языки высокого уровня, например, С++, вы можете присвоить переменной как число, так и строку. Одинаково все это будет считаться строкой. Оболочка поддерживает только слияние строк, для этого просто запишите имена переменных подряд:

#!/bin/bash
string1="hello "
string2=world
string=$string1$string2 and me
string3=$string1$string2" and me"
echo $string3

bash2

Проверяем:

./script

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

Переменные и вывод команд

Переменные не были бы настолько полезны, если бы в них невозможно было записать результат выполнения утилит. Для этого используется такой синтаксис:

$(команда)

С помощью этой конструкции вывод команды будет перенаправлен прямо туда, откуда она была вызвана, а не на экран. Например, утилита date возвращает текущую дату. Эти команды эквивалентны:

date

echo $(date)

bash3

Понимаете? Напишем скрипт, где будет выводиться hello world и дата:

#!/bin/bash
string1="hello world "
string2=$(date)
string=$string1$string2
echo $string

bash4

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

Параметры скрипта

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

Переменная с именем 1 содержит значение первого параметра, переменная 2, второго и так далее. Этот bash скрипт выведет значение первого параметра:

#!/bin/bash
echo $1

bash6

bash5

Управляющие конструкции в скриптах

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

В Bash для проверки условий есть команда Синтаксис ее такой:

if команда_условие
then
команда
else
команда
fi

Эта команда проверяет код завершения команды условия, и если 0 (успех) то выполняет команду или несколько команд после слова then, если код завершения 1 выполняется блок else, fi означает завершение блока команд.

Но поскольку нам чаще всего нас интересует не код возврата команды, а сравнение строк и чисел, то была введена команда [[, которая позволяет выполнять различные сравнения и выдавать код возврата зависящий от результата сравнения. Ее синтаксис:

[[ параметр1 оператор параметр2 ]]

Для сравнения используются уже привычные нам операторы <,>,=,!= и т д. Если выражение верно, команда вернет 0, если нет — 1. Вы можете немного протестировать ее поведение в терминале. Код возврата последней команды хранится в переменной $?:

bash7

Теперь объединением все это и получим скрипт с условным выражением:

#!/bin/bash
if [[ $1 > 2 ]]
then
echo $1" больше 2"
else
echo $1" меньше 2 или 2"
fi

bash8

bash9

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

Циклы в скриптах

Преимущество программ в том, что мы можем в несколько строчек указать какие действия нужно выполнить несколько раз. Например, возможно написание скриптов на bash, которые состоят всего из нескольких строчек, а выполняются часами, анализируя параметры и выполняя нужные действия.

Первым рассмотрим цикл for. Вот его синтаксис:

for переменная in список
do
команда
done

Перебирает весь список, и присваивает по очереди переменной значение из списка, после каждого присваивания выполняет команды, расположенные между do и done.

Например, переберем пять цифр:

#!/bin/bash
for index in 1 2 3 4 5
do
echo $index
done

bash10

bash11

Или вы можете перечислить все файлы из текущей директории:

for file in $(ls -l); do echo "$file"; done

bash12

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

Второй цикл, который мы рассмотрим — это цикл while, он выполняется пока команда условия возвращает код 0, успех. Рассмотрим синтаксис:

while команда условие
do
команда
done

Рассмотрим пример:

#!/bin/bash
index=1
while [[ $index < 5 ]]
do
echo $index
let "index=index+1"
done

bash14

bash13

Как видите, все выполняется, команда let просто выполняет указанную математическую операцию, в нашем случае увеличивает значение переменной на единицу.

Хотелось бы отметить еще кое-что. Такие конструкции, как while, for, if рассчитаны на запись в несколько строк, и если вы попытаетесь их записать в одну строку, то получите ошибку. Но тем не менее это возможно, для этого там, где должен быть перевод строки ставьте точку с запятой «;». Например, предыдущий цикл можно было выполнить в виде одной строки:

index=1; while [[ $index < 5 ]]; do echo $index; let "index=index+1"; done;

Все очень просто я пытался не усложнять статью дополнительными терминами и возможностями bash, только самое основное. В некоторых случаях, возможно, вам понадобиться сделать gui для bash скрипта, тогда вы можете использовать такие программы как zenity или kdialog, с помощью них очень удобно выводить сообщения пользователю и даже запрашивать у него информацию.

Выводы

Теперь вы понимаете основы создания скрипта в linux и можете написать нужный вам скрипт, например, для резервного копирования. Я пытался рассматривать bash скрипты с нуля. Поэтому далеко не все аспекты были рассмотрены. Возможно, мы еще вернемся к этой теме в одной из следующих статей.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Определение Bash-сценария

Сценарий (скрипт) оболочки Bash представляет собой текстовый файл с набором команд, которые необходимо выполнить в определенном порядке и/или условиями. Bash-скрипт призван избавить пользователей Linux от ввода множества различных команд для решения частых задач.

Где хранить Bash-сценарии?

Перед началом написания сценария нужно определиться с местом его хранения. Системные сценарии обычно находятся в директориях /bin и /sbin, а также в /usr/bin и /usr/sbin. Для собственных сценариев рекомендую использовать каталоги /usr/local/sbin и /usr/local/bin, однако ничто вам не мешает (кроме ограничения прав записи) хранить свои сценарии в любых других не системных каталогах.

Если вы решили использовать, какой-либо нестандартный каталог, то не забудьте добавить его в переменную среды $PATH, чтобы вы могли запускать свои сценарии по имени, без указания полного пути.

Изменять переменную $PATH следует в файле ~/.bash_profile, если его нет то в ~/.profile.

Например,  если я хочу хранить сценарии в каталоге ~/oleg/bash_scripts, то мне необходимо написать следующую строку.

PATH="$PATH:~/oleg/bash_scripts"

Так при инициализации работы оболочки ваш каталог уже будет добавлен в переменную $PATH.

Как создать и выполнить Bash-сценарий?

Для примера, в каталоге /usr/local/sbin,  создадим скрипт say_hi.sh, который будет выводить в консоли текстовую строку «Hello Universe!».

touch /usr/local/sbin/say_hi.sh

Далее откроем этот файл любым текстовым редактором, например Vim.

vim /usr/local/sbin/say_hi.sh

И укажем в нем следующие строки.

#!/bin/bash

echo «Hellow Universe!»

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

Если не указать интерпретатор вручную, то будет использоваться интерпретатор по умолчанию, чаще всего это оболочка /bin/sh.

Во второй строке указана команда вывода echo и ее аргумент «Hello Universe!».

Чтобы скрипт мог быть выполнен к нему необходимо добавить бит исполнения файла.

chmod +x /usr/local/sbin/say_hi.sh

Теперь можно просто указать имя скрипта и запустить его.

say_hi.sh

В результате увидим следующее.

meliorem@ubuntu:~$ say_hi.sh
Hello Universe!

Скрипт можно также передать самой оболочке в качестве аргумента . В этом случае делать скрипт исполняемым не обязательно.
bash say_hi.sh

Ввод и вывод данных в Bash

Вывод текстовой информации можно осуществлять с помощью команд echo и printf.

Разница между ними лишь в том, что echo не позволяет форматировать текст (без добавления ключа -e) и делает автоматический перенос строки в отличии от printf.

Различия команд представлены ниже.

#!/bin/bash

echo «tHello there! u263bn»

printf «tHello there! u263bn»

meliorem@ubuntu:~$ say_hi.sh
tHello there! u263bn
Hello there! ☻
meliorem@ubuntu:~$

Ввод данных осуществляется с помощью команды — read. Результат ввода необходимо сохранять в переменную.

#!/bin/bash

echo n «Введите ваше имя: «

read user_name

echo «Добрый день, $user_name!»

meliorem@ubuntu:~$ Введите ваше имя: Oleg
Добрый день, Oleg!
meliorem@ubuntu:~$

Комментарии в Bash

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

Комментарии полностью игнорируются интерпретатором (кроме первой строки).

Однострочным комментарием будет считаться одна или несколько строк в начале которых стоит символ — #.

#!/bin/bash

echo n «Введите ваше имя: «

# Просим пользователя ввести своё имя.

read user_name

echo «Добрый день, $user_name!»

В Bash также доступны многострочные комментарии, которые начинаются с символа — : и находятся внутри двойных или одинарных кавычек.

Не забудьте оставить пробел между : и первой кавычкой.

#!/bin/bash

: «

Данный скрипт принимает два числа

в качестве аргументов

и выводит результат

их суммы.

«

((sum=$1+$2))

echo $sum

exit

Еще один вариант составления многострочного комментария.

#!/bin/bash

echo n «Введите ваше имя: «

&lt;&lt;bigcomment

Просим пользователя

ввести своё имя.

bigcomment

read user_name

echo «Добрый день, $user_name!»

Отладка Bash-скриптов

В Bash поддерживается отладка скриптов и проверка синтаксиса.

Используйте команду bash c ключом -x для запуска скрипта в режиме отладки.

bash -x script.sh

Также есть возможность передать ключ в самом скрипте.

#!/bin/bash -x

echo “Ждать 5 секунд”

sleep 5

echo “Выполнено!

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

Чтобы начать отладку определенного участка кода, вставьте строку с set -x в начало участка и set +x в его конец.

С помощью команды set можно включать и выключать определенные параметры оболочки. Ознакомится со списком параметров можно после ввода команды set -o.

  • set -x/set +x — начать/закончить отладку.
  • set -v — выводить строки ввода по мере их чтения.
  • set -n — проверка синтаксиса, без выполнения самого кода.
  • set -o [параметр]/set +o [параметр] — включение/выключение параметра.

В следующем примере команда создания каталога не будет выполнена, также в консоли появится сообщение об ошибке синтаксиса.

#!/bin/bash

# Включаем параметр проверки синтаксиса

set o noexec

if [someerror]

mkdir project

echo «Создан новый каталог.»

# Выключаем параметр проверки синтаксиса

set +o noexec

# Другой код далее…

Особенности написания Bash-скриптов

  1. В первой строке всегда указывается интерпретатор, который будет выполнять скрипт.
    Помимо Bash вы также можете использовать другие интерпретаторы, например #!/bin/sh, #!/usr/bin/perl, #!/usr/bin/python и другие.
    Чтобы узнать путь к интерпретатору используйте команду which, например which python.
  2. Так как расширение файла не играет в Linux особой роли то приписывать .sh совсем не обязательно.
    Это делается для удобства самого пользователя.
  3. Слишком длинные команды вы можете разбить на несколько строк с помощью символа — .
  4. Вне зависимости того в какой оболочке вы находитесь, будь это zsh, csh или любая другая, скрипт будет выполнять та оболочка, путь к которой указан в первой строке.
Это последня статья в разделе Linux. Здесь мы обсудим концепцию скриптинга — написания скриптов или сценариев. Это краткое введение в создание bash-скриптов.

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

Что такое bash-скрипты

Bash-скрипт (от англ. script — сценарий) — это последовательность команд, которые по очереди считывает и выполняет интерпретатор. В нашем случае это командная строка — bash.

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

Компьютерный сценарий — это обычный текстовый файл, в котором перечислены обычные команды. Отличие заключается в том, что раньше мы вводили эти команды вручную в терминал, а в скрипте их будет «вводить» интерпретатор — bash. Скрипт можно создать как и любой другой текстовый файл с помощью обычного текстового редактора: например, VI, который мы обсуждали в этой статье.  

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

Разберем на примере

Ниже — простой скрипт. Он выводит сообщение на экран с помощью команды echo, а затем — список того, что находится в вашем текущем каталоге.

echo <сообщение>

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

#!/bin/bash
# Демонстрационный скрипт
# karpaff 22/01/2022

echo Список файлов в текущем каталоге:
ls

Теперь давайте разбираться, как всё устроено, с помощью командой строки. Ниже — объяснение, что тут происходит. 

1. [email protected]: cat myscript.sh
2. #!/bin/bash
3. # Демонстрационный скрипт
4. # karpaff 22/01/2022
5.
6. echo Список файлов в текущем каталоге:
7. ls
8. [email protected]: 
9. [email protected]: ls -l myscript.sh
10. -rwxr-xr-x 1 karpaff users 2 Jan 22 2022 myscript.sh 
11. [email protected]:
12. [email protected]: ./myscript.sh
13. Список файлов в текущем каталоге:
14. barry.txt bob example.png firstfile foo1 myoutput video.mpeg
15. [email protected]: 
  • Строка 1. Посмотрим на наш скрипт. Linux — система без расширений, поэтому скрипты не обязаны иметь расширение .sh. Однако обычно его ставят, чтобы скрипты было сразу заметно.
  • Строка 2. Самой первой строкой скрипта всегда должна быть эта строка — она указывает, какой интерпретатор следует использовать. Первые два символа называются шебанг (shebang). После этого без пробелов указывается путь к интерпретатору. О лучших практиках shebang можно почитать здесь. 
  • Строки 3 и 4. Всё, что идет после # — комментарий. Интерпретатор игнорирует их, они нужно для нашего удобства. Хорошая практика — указывать ваше имя и дату написания скрипта, а также краткое описание того, что этот сценарий делает. 
  • Строка 6. Мы будем использовать программу под названием echo Она просто выводит на экран всё, что вы поместите справа от нее. 
  • Строка 7. Выводим на экран содержимое текущего каталога с помощью команды ls.
  • Строка 9. У сценария должно быть разрешение execute, чтобы его можно было запустить. Как вы видите, у нашего файла есть такое разрешение. 
  • Строка 12. Запускаем сам скрипт. Зачем нужно ./ расскажем чуть ниже.
  • Строки 13 и 14. Результат работы нашего скрипта.

Шебанг

Самая первая строчка скрипта указывает системе, какой интерпретатор следует использовать для этого файла. В ней не должно быть пробелов. Первые два символа #! — так называемый шебанг (shebang), который говорит системе, что сразу после них идет путь к используемому интерпретатору.

 #![путь к интепретатору]

Если вы не знаете, где находится нужный интерпретатор, можно использовать команду which

which <команда>

1. [email protected]: which bash
2. /bin/bash
3. [email protected]:
4. [email protected]: which ls
5. /usr/bin/ls
6. [email protected]:

Строчку с указанием на интепретатор можно не писать, и bash-скрипт всё равно будет работать. Большинство оболочек, включая bash, в таком случае будут считать интерпретатором себя. Однако всегда указывать интепретатор — хорошая привычка. Если вы или кто-то другой запустите  скрипт в условиях, когда bash не используется в качестве оболочки, сценарий может работать не так, как задумывалось. 

Имя

Linux — это ОС без расширений. Это значит, что мы можем назвать наш скрипт как угодно, и это никак не повлияет на его выполнение. Обычно для скриптов все-таки записывают расширение .sh, но это делатеся исключитьельно для удобства. Наш скрипт можно было назвать и просто myscript или даже myscript.jpg — он бы всё равно работал так же.

Комментарии

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

1. [email protected]: cat myscript.sh
2. #!/bin/bash
3. # Этот комментарий занимает всю строчку
4. ls # Этот комментарий идет после команды
5. [email protected]:

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

Комментировать каждую строчку не нужно. Большинство строчек сами объясняют, что они делают. Вставляйте комментарии только для важных строк или для объяснения конкретной команды, действие которой может быть понятно не сразу.

Зачем мы используем ./

Когда мы вводим команду в терминале, система проходит по заданному ряду каталогов в поисках этой команды. Этот путь можно увидеть с помощью переменной PATH

1. [email protected]: echo $PATH
2. /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/mit/bin:/usr/lib/mit/sbin
3. [email protected]:

Сначала система ищет команду в первой директории. Если она там есть, команда запускается, если нет — система проверяет вторую директорию и так далее. Каталоги разделяются : (двоеточие).

Система не будет искать команду нигде, кроме перечисленных каталогов. Это поведение можно изменить, указав путь. В таком случае система как бы говорит: «Вы сказали мне, где искать скрипт, поэтому я проигнорирую PATH и пойду сразу в указанное место».

В статье «Основы навигации» мы уже обсуждали, что . (точка) означает текущий каталог, поэтому, когда мы пишем ./myscript.sh, мы фактически говорим системе искать скрипт в текущем каталоге.

Мы можем также использовать абсолютный путь /home/karpaff/linuxtutorialwork/myscript.sh или относительный путь, если мы не находимся в той же директории, что и скрипт ../linuxtutorialwork/myscript.sh.

Если бы можно было запускать скрипты в текущем каталоге без этого механизма, то злоумышленники могли бы легко создать вредоносный скрипт в определенном каталоге и назвать его ls, например. Если бы пользователь захотел посмотреть содержимое этого каталога, он бы мог случайно запустить этот опасный скрипт. 

Разрешения

Для запуска у сценария должно быть разрешение на выполнение — даже если вы являетесь владельцем файла. По соображениям безопасности, по умолчанию у вас нет разрешения execute, поэтому его необходимо добавить. Чтобы убедиться, что ваш скрипт настроен правильно, можно ввести команду chmod 755 <скрипт>.

chmod 755 <скрипт>

Переменные

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

• Чтобы создать переменную, нужно указать её имя, затем = (знак равенства) и значение — оно будет хранится в «контейнере». Слева и справа от знака равно не должно быть пробелов.

name='karpaff'

• Когда мы ссылаемся на переменную, нужно поставить $ (знак доллара) перед именем переменной.

$name

Разберемся на примере:

1. [email protected]: cat variableexample.sh
2. #!/bin/bash
3. # Демонстрация переменных
4. # karpaff 22/1/2022
5.
6. [email protected]: name='karpaff'
7. echo Hello $name
8. [email protected]: 
9. [email protected]: ./variableexample.sh
10. Hello karpaff
11. [email protected]: 

Переменные, связанные с параметрами

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

  • $0 — содержит имя скрипта.
  • $1$9 — содержат параметры, переданные скрипту: $1 — первый аргумент, $2 — второй и так далее.
  • $# — содержит количество параметров, переданных скрипту.
  • $* — содержит все параметры, переданные скрипту.

Существуют и другие переменные, но для начала этих должно быть достаточно.

Разберемся на примере: 

1. [email protected]: cat morevariables.sh
2. #!/bin/bash
3. # Демонстрация использования переменных
4. # karpaff 22/1/2022
5.
6. echo Меня зовут $0 и мне передали $# параметра(ов)
7. echo Вот они: $*
8. echo А второй параметр вот такой: $2
9. [email protected]: 
10. [email protected]: ./morevariables.sh bob fred sally
11. Меня зовут morevariables.sh и мне передали 3 параметра(ов)
12. Вот они: bob fred sally
13. А второй параметр вот такой: fred
14. [email protected]: 

Переменная, содержащая вывод команды

Вывод команды тоже мождно сохранить в переменную — для этого используется ` (обратный апостроф).

Примечание. Обратите внимание, что это именно обратный апостроф, а не одинарная кавычка. Обычно обратный апостроф находится на клавиатуре на букве ё — слева от клавиши 1.

Разберемся на примере: 

1. [email protected]: cat backticks.sh
2. #!/bin/bash
3. # Используем обратный апостроф
4. # karpaff 22/1/2022
5. 
6. lines=`cat $1 | wc -l`
7. echo Количество строчек в файле $1 равно $lines
8. [email protected]:
9. [email protected]: ./backticks.sh testfile.txt
10. Количество строчек в файле testfile.txt равно 12
11. [email protected]

Создаем резервные копии с помощью скрипта

Теперь давайте используем всё, что мы изучили, в сценарий, который действительно делает что-то полезное. Допустим, вы храните все свои проекты в отдельных каталогах в директории под названием Projects, которая лежит в домашнем каталоге. Вам нужно регулярно делать резервные копии этих проектов и хранить их в датированных папках в каталоге под названием Projectbackups — она тоже в домашнем каталоге.

1. [email protected]: cat projectbackup.sh
2. #!/bin/bash
3. # Создает резервную копию проекта
4. # karpaff 22/1/2022
5. 
6. date=`date +%F`
7. mkdir ~/projectbackups/$1_$date
8. cp -R ~/projects/$1 ~/projectbackups/$1_$date
9. echo Резервное копирование папки $1 завершено
10. [email protected]: 
11. [email protected]: ./projectbackup.sh ocelot
12. Резервное копирование папки ocelot завершено
13. [email protected]:

Вы можете заметите, что в приведенном выше скрипте мы использовали относительные пути. Это делает сценарий более универсальным. Если кто-то из ваших коллег захочет использовать его, можно будет просто дать ему копию скрипта, и он будет работать так же хорошо без изменений.

Вы всегда должны думать о том, как сделать скрипты гибкими и универсальными, чтобы их легко могли использовать другие пользователи или чтобы их можно было адаптированы к аналогичным ситуациям. Чем более «многоразовый» у вас скрипт — тем лучше.

Оператор условия if

У нас получился классный сценарий резервного копирования, но что если в процессе выполнения произойдет какая-то ошибка? Тогда скрипт не сработает, а мы об этом даже не узнаем. Чтобы такого не случилось, напишем в сценарии сообщения об ошибках. Так мы поймем, что именно пошло не так. Для этого нам понадобится оператор условия if

1. [email protected]: cat projectbackup.sh
2. #!/bin/bash
3. # Создает резервную копию проекта
4. # karpaff 22/1/2022
5. 
6. if [ $# != 1 ]
7. then
8.    echo 'Должен быть указан 1 аргумент — папка, для которой нужно провести резервное копирование'
9.    exit
10. fi
11. if [ ! -d ~/projects/$1 ]
12. then
13.    echo 'Переданная папка не существует'
14.    exit
15. fi
16. date=`date +%F`
17.
18. # Мы уже создали папку резервного копирования для сегодняшней даты?
19. if [ -d ~/projectbackups/$1_$date ]
20. then
21.    echo 'Для этого проекта уже создана резервная копия, перезаписать?'
22.    read answer
23.    if [ $answer != 'y' ]
24.    then
25.        exit
26.    fi
27. else
28.    mkdir ~/projectbackups/$1_$date
29. fi
30. cp -R ~/projects/$1 ~/projectbackups/$1_$date
31. echo Резервное копирование папки $1 завершено
32. [email protected]: 

Давайте разберемся, что здесь происходит: 

  • Строка 6. Открываем условную конструкцию с помощью оператора if. Форматирование здесь очень важно: обратите внимание, где находятся пробелы, они необходимы для правильной работы. В этом выражении мы спрашиваем, не равно ли != количество аргументов $# единице.
  • Строка 8. Если нет, скрипт был вызван неправильно. Выводим сообщение, объясняющее, как следует использовать наш сценарий.
  • Строка 9. Поскольку скрипт не был вызван должным образом, нужно выйти из скрипта, прежде чем продолжить работу.
  • Строка 10. Закрываем условную конструкцию с помощью оператора fi — if наоборот.
  • Строка 11. ! (восклицательный знак) означает отрицание, то есть «не», символ -d означает «путь существует и является каталогом». Всё условие в итоге читается так: «Если данный каталог не существует».
  • Строка 22. Просим пользователя ввести данные с помощью команды read. Команд принимает один аргумент, который является переменной для хранения ответа.
  • Строка 23. Смотрим, как ответил пользователь, действуем соответственно соответственно.

Примечание. Обратите внимание, что некоторые строки в нашем коде имеют отступы. Это не обязательно делать, но оступы — хорошая привычка: так код читать гораздо легче. 

Совет. Конструция if на самом деле использует команду test. Если вы хотите узнать обо всех возможных сравнениях загляните на страницу руководства для команды test.

Что нужно запомнить

Команды

#!
Шебанг. Указывает, какой интепретатор должен запускать скрипт. 

echo
Выводит сообщение на экран.

which
Выводит путь к определенной команде.

$
Позволяет обращаться к значению переменной.

` ` 
Обратные апострофы. Сохраняют вывод команды в переменную.

date
Выводит на экран дату.

if [ ] then else fi
Условная конструкция. 

Идеи

В скрипте — обычные команды
Всё, что вы можете сделать в командной строке, можно реализовать в сценарии с тем же результатом — и наоборот.

Форматирование важно
Bash-скрипты чутки к форматированию. Убедитесь, что пробелы есть там, где они нужны, и отсутсвуют там, где они не нужны.

Практические задания

Для решения этих задач вам потребуются навыки и знания из этой и всех предыдущих статей.

2. Напишите скрипит, который будет предоставлять отчёт об определенной папке. Вот, на какие вопросы должен отвечать ваш скрипт:

Shell scripting is an important part of process automation in Linux. Scripting helps you write a sequence of commands in a file and then execute them.

This saves you time because you don’t have to write certain commands again and again. You can perform daily tasks efficiently and even schedule them for automatic execution.

You can also set certain scripts to execute on startup such as showing a particular message on launching a new session or setting certain environment variables.

The applications and uses of scripting are numerous, so let’s dive in.

In this article, you will learn:

  1. What is a bash shell?
  2. What is a bash script and how do you identify it?
  3. How to create your first bash script and execute it.
  4. The basic syntax of shell scripting.
  5. How to see a system’s scheduled scripts.
  6. How to automate scripts by scheduling via cron jobs.

The best way to learn is by practicing. I highly encourage you to follow along using Replit. You can access a running Linux shell within minutes.

Introduction to the Bash Shell

The Linux command line is provided by a program called the shell. Over the years, the shell program has evolved to cater to various options.

Different users can be configured to use different shells. But most users prefer to stick with the current default shell. The default shell for many Linux distros is the GNU Bourne-Again Shell (bash). Bash is succeeded by Bourne shell (sh).

When you first launch the shell, it uses a startup script located in the .bashrc or .bash_profile file which allows you to customize the behavior of the shell.

When a shell is used interactively, it displays a $ when it is waiting for a command from the user. This is called the shell prompt.

[username@host ~]$

If shell is running as root, the prompt is changed to #. The superuser shell prompt looks like this:

[root@host ~]#

Bash is very powerful as it can simplify certain operations that are hard to accomplish efficiently with a GUI. Remember that most servers do not have a GUI, and it is best to learn to use the powers of a command line interface (CLI).

What is a Bash Script?

A bash script is a series of commands written in a file. These are read and executed by the bash program. The program executes line by line.

For example, you can navigate to a certain path, create a folder and spawn a process inside it using the command line.

You can do the same sequence of steps by saving the commands in a bash script and running it. You can run the script any number of times.

How Do You Identify a Bash Script?

File extension of .sh.

By naming conventions, bash scripts end with a .sh. However, bash scripts can run perfectly fine without the sh extension.

Scripts start with a bash bang.

Scripts are also identified with a shebang. Shebang is a combination of bash # and bang !  followed the the bash shell path. This is the first line of the script. Shebang tells the shell to execute it via bash shell. Shebang is simply an absolute path to the bash interpreter.

Below is an example of the shebang statement.

#! /bin/bash

The path of the bash program can vary. We will see later how to identify it.

Execution rights

Scripts have execution rights for the user executing them.

An execution right is represented by x. In the example below, my user has the rwx (read, write, execute) rights for the file test_script.sh

image-98

File colour

Executable scripts appear in a different colour from rest of the files and folders.

In my case, the scripts with execution rights appear as green.

image-99

How to Create Your First Bash Script

Let’s create a simple script in bash that outputs Hello World.

Create a file named hello_world.sh

touch hello_world.sh

Find the path to your bash shell.

which bash

image-100

In my case, the path is /usr/bin/bash and I will include this in the shebang.

Write the command.

We will echo «hello world» to the console.

Our script will look something like this:

#! usr/bin/bash
echo "Hello World"

Edit the file hello_world.sh using a text editor of your choice and add the above lines in it.

Provide execution rights to your user.

Modify the file permissions and allow execution of the script by using the command below:

chmod u+x hello_world.sh

chmod modifies the existing rights of a file for a particular user. We are adding +x to user u.

Run the script.

You can run the script in the following ways:

./hello_world.sh

bash hello_world.sh.

Here’s the output:

Two ways to run scripts

Two ways to run scripts

The Basic Syntax of Bash Scripting

Just like any other programming language, bash scripting follows a set of rules to create programs understandable by the computer. In this section, we will study the syntax of bash scripting.

How to define variables

We can define a variable by using the syntax variable_name=value. To get the value of the variable, add $ before the variable.

#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name

image-104

Tux is also the name of the Linux mascot, the penguin.

Hi, I am Tux.

Hi, I am Tux.

Arithmetic Expressions

Below are the operators supported by bash for mathematical calculations:

Operator Usage
+ addition
subtraction
* multiplication
/ division
** exponentiation
% modulus

Let’s run a few examples.

Note the spaces, these are part of the syntax

Note the spaces, these are part of the syntax

Numerical expressions can also be calculated and stored in a variable using the syntax below:

var=$((expression))

Let’s try an example.

#!/bin/bash

var=$((3+9))
echo $var

image-109

Fractions are not correctly calculated using the above methods and truncated.

For decimal calculations, we can use bc command to get the output to a particular number of decimal places. bc (Bash Calculator) is a command line calculator that supports calculation up to a certain number of decimal points.

echo "scale=2;22/7" | bc

Where scale defines the number of decimal places required in the output.

Getting output to 2 decimal places

Getting output to 2 decimal places

How to read user input

Sometimes you’ll need to gather user input and perform relevant operations.

In bash, we can take user input using the read command.

read variable_name

To prompt the user with a custom message, use the -p flag.

read -p "Enter your age" variable_name

Example:

#!/bin/bash

echo "Enter a numner"
read a

echo "Enter a numner"
read b

var=$((a+b))
echo $var

image-111

Numeric Comparison logical operators

Comparison is used to check if statements evaluate to true or false. We can use the below shown operators to compare two statements:

Operation Syntax Explanation
Equality num1 -eq num2 is num1 equal to num2
Greater than equal to num1 -ge num2 is num1 greater than equal to num2
Greater than num1 -gt num2 is num1 greater than num2
Less than equal to num1 -le num2 is num1 less than equal to num2
Less than num1 -lt num2 is num1 less than num2
Not Equal to num1 -ne num2 is num1 not equal to num2

Syntax:

if [ conditions ]
    then
         commands
fi

Example:

Let’s compare two numbers and find their relationship:

read x
read y

if [ $x -gt $y ]
then
echo X is greater than Y
elif [ $x -lt $y ]
then
echo X is less than Y
elif [ $x -eq $y ]
then
echo X is equal to Y
fi

Output:

image-112

Conditional Statements (Decision Making)

Conditions are expressions that evaluate to a boolean expression (true or false). To check conditions, we can use if, if-else, if-elif-else and nested conditionals.

The structure of conditional statements is as follows:

  • if...then...fi statements
  • if...then...else...fi statements
  • if..elif..else..fi
  • if..then..else..if..then..fi..fi.. (Nested Conditionals)

Syntax:

if [[ condition ]]
then
	statement
elif [[ condition ]]; then
	statement 
else
	do this by default
fi

To create meaningful comparisons, we can use AND -a and OR -o as well.

The below statement translates to: If a is greater than 40 and b is less than 6.

if [ $a -gt 40 -a $b -lt 6 ]

Example: Let’s find the triangle type by reading the lengths of its sides.

read a
read b
read c

if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERAL

elif [ $a == $b -o $b == $c -o $a == $c ]
then 
echo ISOSCELES
else
echo SCALENE

fi

Output:

Test case #1

image-113

Test case #2

image-114

Test case #3

image-115

Looping and skipping

For loops allow you to execute statements a specific number of times.

Looping with numbers:

In the example below, the loop will iterate 5 times.

#!/bin/bash

for i in {1..5}
do
    echo $i
done

Looping-with-numbers

Looping with strings:

We can loop through strings as well.

#!/bin/bash

for X in cyan magenta yellow  
do
	echo $X
done

Looping-with-strings

While loop

While loops check for a condition and loop until the condition remains true. We need to provide a counter statement that increments the counter to control loop execution.

In the example below, (( i += 1 )) is the counter statement that increments the value of i.

Example:

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done

image-153

Reading files

Suppose we have a file sample_file.txt as shown below:

image-151

We can read the file line by line and print the output on the screen.

#!/bin/bash

LINE=1

while read -r CURRENT_LINE
	do
		echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < "sample_file.txt"

Output:

Lines with line number printed

Lines with line number printed

How to execute commands with back ticks

If you need to include the output of a complex command in your script, you can write the statement inside back ticks.

Syntax:

var= ` commands `

Example: Suppose we want to get the output of a list of mountpoints with tmpfs in their name. We can craft a statement like this: df -h | grep tmpfs.

To include it in the bash script, we can enclose it in back ticks.

#!/bin/bash

var=`df -h | grep tmpfs`
echo $var

Output:

image-118

How to get arguments for scripts from the command line

It is possible to give arguments to the script on execution.

$@ represents the position of the parameters, starting from one.

#!/bin/bash

for x in $@
do
    echo "Entered arg is $x"
done

Run it like this:

./script arg1 arg2

image-155

How to Automate Scripts by Scheduling via cron Jobs

Cron is a job scheduling utility present in Unix like systems. You can schedule jobs to execute daily, weekly, monthly or in a specific time of the day. Automation in Linux heavily relies on cron jobs.

Below is the syntax to schedule crons:

# Cron job example
* * * * * sh /path/to/script.sh

Here, * represent represents minute(s) hour(s) day(s) month(s) weekday(s), respectively.

Below are some examples of scheduling cron jobs.

SCHEDULE SCHEDULED VALUE
5 0 * 8 * At 00:05 in August.
5 4 * * 6 At 04:05 on Sunday.
0 22 * * 1-5 At 22:00 on every day-of-week from Monday through Friday.

You can learn about cron in detail in this blog post.

How to Check Existing Scripts in a System

Using crontab

crontab -l lists the already scheduled scripts for a particular user.

My scheduled scripts

My scheduled scripts

Using the find command

The find command helps to locate files based on certain patterns. As most of the scripts end with .sh, we can use the find script like this:

find . -type f -name "*.sh"
`

Where,

  • . represents the current directory. You can change the path accordingly.
  • -type f indicates that the file type we are looking for is a text based file.
  • *.sh tells to match all files ending with .sh.

image-159

If you are interested to read about the find command in detail, check my other post.

Wrapping up

In this tutorial we learned the basics of shell scripting. We looked into examples and syntax which can help us write meaningful programs.

What’s your favorite thing you learned from this tutorial? Let me know on Twitter!

You can read my other posts here.

Work vector created by macrovector — www.freepik.com

Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started

Shell scripting is an important part of process automation in Linux. Scripting helps you write a sequence of commands in a file and then execute them.

This saves you time because you don’t have to write certain commands again and again. You can perform daily tasks efficiently and even schedule them for automatic execution.

You can also set certain scripts to execute on startup such as showing a particular message on launching a new session or setting certain environment variables.

The applications and uses of scripting are numerous, so let’s dive in.

In this article, you will learn:

  1. What is a bash shell?
  2. What is a bash script and how do you identify it?
  3. How to create your first bash script and execute it.
  4. The basic syntax of shell scripting.
  5. How to see a system’s scheduled scripts.
  6. How to automate scripts by scheduling via cron jobs.

The best way to learn is by practicing. I highly encourage you to follow along using Replit. You can access a running Linux shell within minutes.

Introduction to the Bash Shell

The Linux command line is provided by a program called the shell. Over the years, the shell program has evolved to cater to various options.

Different users can be configured to use different shells. But most users prefer to stick with the current default shell. The default shell for many Linux distros is the GNU Bourne-Again Shell (bash). Bash is succeeded by Bourne shell (sh).

When you first launch the shell, it uses a startup script located in the .bashrc or .bash_profile file which allows you to customize the behavior of the shell.

When a shell is used interactively, it displays a $ when it is waiting for a command from the user. This is called the shell prompt.

[username@host ~]$

If shell is running as root, the prompt is changed to #. The superuser shell prompt looks like this:

[root@host ~]#

Bash is very powerful as it can simplify certain operations that are hard to accomplish efficiently with a GUI. Remember that most servers do not have a GUI, and it is best to learn to use the powers of a command line interface (CLI).

What is a Bash Script?

A bash script is a series of commands written in a file. These are read and executed by the bash program. The program executes line by line.

For example, you can navigate to a certain path, create a folder and spawn a process inside it using the command line.

You can do the same sequence of steps by saving the commands in a bash script and running it. You can run the script any number of times.

How Do You Identify a Bash Script?

File extension of .sh.

By naming conventions, bash scripts end with a .sh. However, bash scripts can run perfectly fine without the sh extension.

Scripts start with a bash bang.

Scripts are also identified with a shebang. Shebang is a combination of bash # and bang !  followed the the bash shell path. This is the first line of the script. Shebang tells the shell to execute it via bash shell. Shebang is simply an absolute path to the bash interpreter.

Below is an example of the shebang statement.

#! /bin/bash

The path of the bash program can vary. We will see later how to identify it.

Execution rights

Scripts have execution rights for the user executing them.

An execution right is represented by x. In the example below, my user has the rwx (read, write, execute) rights for the file test_script.sh

image-98

File colour

Executable scripts appear in a different colour from rest of the files and folders.

In my case, the scripts with execution rights appear as green.

image-99

How to Create Your First Bash Script

Let’s create a simple script in bash that outputs Hello World.

Create a file named hello_world.sh

touch hello_world.sh

Find the path to your bash shell.

which bash

image-100

In my case, the path is /usr/bin/bash and I will include this in the shebang.

Write the command.

We will echo «hello world» to the console.

Our script will look something like this:

#! usr/bin/bash
echo "Hello World"

Edit the file hello_world.sh using a text editor of your choice and add the above lines in it.

Provide execution rights to your user.

Modify the file permissions and allow execution of the script by using the command below:

chmod u+x hello_world.sh

chmod modifies the existing rights of a file for a particular user. We are adding +x to user u.

Run the script.

You can run the script in the following ways:

./hello_world.sh

bash hello_world.sh.

Here’s the output:

Two ways to run scripts

Two ways to run scripts

The Basic Syntax of Bash Scripting

Just like any other programming language, bash scripting follows a set of rules to create programs understandable by the computer. In this section, we will study the syntax of bash scripting.

How to define variables

We can define a variable by using the syntax variable_name=value. To get the value of the variable, add $ before the variable.

#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name

image-104

Tux is also the name of the Linux mascot, the penguin.

Hi, I am Tux.

Hi, I am Tux.

Arithmetic Expressions

Below are the operators supported by bash for mathematical calculations:

Operator Usage
+ addition
subtraction
* multiplication
/ division
** exponentiation
% modulus

Let’s run a few examples.

Note the spaces, these are part of the syntax

Note the spaces, these are part of the syntax

Numerical expressions can also be calculated and stored in a variable using the syntax below:

var=$((expression))

Let’s try an example.

#!/bin/bash

var=$((3+9))
echo $var

image-109

Fractions are not correctly calculated using the above methods and truncated.

For decimal calculations, we can use bc command to get the output to a particular number of decimal places. bc (Bash Calculator) is a command line calculator that supports calculation up to a certain number of decimal points.

echo "scale=2;22/7" | bc

Where scale defines the number of decimal places required in the output.

Getting output to 2 decimal places

Getting output to 2 decimal places

How to read user input

Sometimes you’ll need to gather user input and perform relevant operations.

In bash, we can take user input using the read command.

read variable_name

To prompt the user with a custom message, use the -p flag.

read -p "Enter your age" variable_name

Example:

#!/bin/bash

echo "Enter a numner"
read a

echo "Enter a numner"
read b

var=$((a+b))
echo $var

image-111

Numeric Comparison logical operators

Comparison is used to check if statements evaluate to true or false. We can use the below shown operators to compare two statements:

Operation Syntax Explanation
Equality num1 -eq num2 is num1 equal to num2
Greater than equal to num1 -ge num2 is num1 greater than equal to num2
Greater than num1 -gt num2 is num1 greater than num2
Less than equal to num1 -le num2 is num1 less than equal to num2
Less than num1 -lt num2 is num1 less than num2
Not Equal to num1 -ne num2 is num1 not equal to num2

Syntax:

if [ conditions ]
    then
         commands
fi

Example:

Let’s compare two numbers and find their relationship:

read x
read y

if [ $x -gt $y ]
then
echo X is greater than Y
elif [ $x -lt $y ]
then
echo X is less than Y
elif [ $x -eq $y ]
then
echo X is equal to Y
fi

Output:

image-112

Conditional Statements (Decision Making)

Conditions are expressions that evaluate to a boolean expression (true or false). To check conditions, we can use if, if-else, if-elif-else and nested conditionals.

The structure of conditional statements is as follows:

  • if...then...fi statements
  • if...then...else...fi statements
  • if..elif..else..fi
  • if..then..else..if..then..fi..fi.. (Nested Conditionals)

Syntax:

if [[ condition ]]
then
	statement
elif [[ condition ]]; then
	statement 
else
	do this by default
fi

To create meaningful comparisons, we can use AND -a and OR -o as well.

The below statement translates to: If a is greater than 40 and b is less than 6.

if [ $a -gt 40 -a $b -lt 6 ]

Example: Let’s find the triangle type by reading the lengths of its sides.

read a
read b
read c

if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERAL

elif [ $a == $b -o $b == $c -o $a == $c ]
then 
echo ISOSCELES
else
echo SCALENE

fi

Output:

Test case #1

image-113

Test case #2

image-114

Test case #3

image-115

Looping and skipping

For loops allow you to execute statements a specific number of times.

Looping with numbers:

In the example below, the loop will iterate 5 times.

#!/bin/bash

for i in {1..5}
do
    echo $i
done

Looping-with-numbers

Looping with strings:

We can loop through strings as well.

#!/bin/bash

for X in cyan magenta yellow  
do
	echo $X
done

Looping-with-strings

While loop

While loops check for a condition and loop until the condition remains true. We need to provide a counter statement that increments the counter to control loop execution.

In the example below, (( i += 1 )) is the counter statement that increments the value of i.

Example:

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done

image-153

Reading files

Suppose we have a file sample_file.txt as shown below:

image-151

We can read the file line by line and print the output on the screen.

#!/bin/bash

LINE=1

while read -r CURRENT_LINE
	do
		echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < "sample_file.txt"

Output:

Lines with line number printed

Lines with line number printed

How to execute commands with back ticks

If you need to include the output of a complex command in your script, you can write the statement inside back ticks.

Syntax:

var= ` commands `

Example: Suppose we want to get the output of a list of mountpoints with tmpfs in their name. We can craft a statement like this: df -h | grep tmpfs.

To include it in the bash script, we can enclose it in back ticks.

#!/bin/bash

var=`df -h | grep tmpfs`
echo $var

Output:

image-118

How to get arguments for scripts from the command line

It is possible to give arguments to the script on execution.

$@ represents the position of the parameters, starting from one.

#!/bin/bash

for x in $@
do
    echo "Entered arg is $x"
done

Run it like this:

./script arg1 arg2

image-155

How to Automate Scripts by Scheduling via cron Jobs

Cron is a job scheduling utility present in Unix like systems. You can schedule jobs to execute daily, weekly, monthly or in a specific time of the day. Automation in Linux heavily relies on cron jobs.

Below is the syntax to schedule crons:

# Cron job example
* * * * * sh /path/to/script.sh

Here, * represent represents minute(s) hour(s) day(s) month(s) weekday(s), respectively.

Below are some examples of scheduling cron jobs.

SCHEDULE SCHEDULED VALUE
5 0 * 8 * At 00:05 in August.
5 4 * * 6 At 04:05 on Sunday.
0 22 * * 1-5 At 22:00 on every day-of-week from Monday through Friday.

You can learn about cron in detail in this blog post.

How to Check Existing Scripts in a System

Using crontab

crontab -l lists the already scheduled scripts for a particular user.

My scheduled scripts

My scheduled scripts

Using the find command

The find command helps to locate files based on certain patterns. As most of the scripts end with .sh, we can use the find script like this:

find . -type f -name "*.sh"
`

Where,

  • . represents the current directory. You can change the path accordingly.
  • -type f indicates that the file type we are looking for is a text based file.
  • *.sh tells to match all files ending with .sh.

image-159

If you are interested to read about the find command in detail, check my other post.

Wrapping up

In this tutorial we learned the basics of shell scripting. We looked into examples and syntax which can help us write meaningful programs.

What’s your favorite thing you learned from this tutorial? Let me know on Twitter!

You can read my other posts here.

Work vector created by macrovector — www.freepik.com

Learn to code for free. freeCodeCamp’s open source curriculum has helped more than 40,000 people get jobs as developers. Get started

Понравилась статья? Поделить с друзьями:
  • Сценарий юбилей металлургического завода
  • Сценарий юбилейного концерта певца
  • Сценарий этнокультурного мероприятия
  • Сценарий юбилея 50 лет однокласснице
  • Сценарий юбилей лилии