Перейти к содержимому

Как создать скрипт в linux

  • автор:

Bash скрипты

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

В этой статье мы обсудим основы написания сценариев bash, включая переменные, команды, ввод/вывод и отладку. Каждый пункт сопроводим примерами.

Оглавление

  1. Минимальные требования
  2. Введение
  • Определение Bash-скрипта
  • Преимущества Bash-скриптов
  • Обзор оболочки Bash и интерфейса командной строки
  • Как запускать команды Bash из командной строки
  • Как создавать и выполнять сценарии Bash
  • Комментарии в сценариях bash
  • Переменные и типы данных в Bash
  • Ввод и вывод в Bash-скриптах
  • Основные команды Bash (echo, read и т. д.)
  • Условные операторы (если/иначе)
  • Цикл While
  • Цикл For
  • Оператор Case

Минимальные требования

Чтобы следовать этому руководству, необходимо иметь следующее:

Работающая версия Linux с доступом к командной строке.
Если у вас не установлен Linux или вы только начинаете его изучать, вы можете легко получить доступ к командной строке Linux через Replit. Replit — это браузерная IDE, в которой вы можете получить доступ к оболочке bash за несколько минут.

Вы также можете установить Linux поверх вашей системы Windows, используя WSL (подсистема Windows для Linux). Инструкция по ссылке.

Введение

Определение Bash-скрипта

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

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

Преимущества Bash-скриптов

Сценарии Bash — это мощный и универсальный инструмент для автоматизации задач системного администрирования, управления системными ресурсами и выполнения других рутинных задач в системах Unix/Linux. Некоторые преимущества сценариев оболочки:

  • Автоматизация: сценарии оболочки позволяют автоматизировать повторяющиеся задачи и процессы, экономя время и снижая риск ошибок, которые могут возникнуть при ручном выполнении.
  • Портативность: сценарии оболочки можно запускать на различных платформах и операционных системах, включая Unix, Linux, macOS и даже Windows, с помощью эмуляторов или виртуальных машин.
  • Гибкость: сценарии оболочки легко настраиваются и могут быть легко изменены в соответствии с конкретными требованиями. Их также можно комбинировать с другими языками программирования или утилитами для создания более мощных сценариев.
  • Доступность. Сценарии оболочки легко писать и не требуют специальных инструментов или программного обеспечения. Их можно редактировать с помощью любого текстового редактора, а в большинстве операционных систем есть встроенный интерпретатор оболочки.
  • Интеграция: сценарии оболочки можно интегрировать с другими инструментами и приложениями, такими как базы данных, веб-серверы и облачные службы, что позволяет решать более сложные задачи автоматизации и управления системой.
  • Отладка: сценарии оболочки легко отлаживать, и большинство оболочек имеют встроенные инструменты отладки и сообщения об ошибках, которые помогают быстро выявлять и устранять проблемы.

Обзор оболочки Bash и интерфейса командной строки

Термины «оболочка» и «bash» взаимозаменяемы. Но между ними есть тонкая разница.

Термин «оболочка» относится к программе, которая предоставляет интерфейс командной строки для взаимодействия с операционной системой. Bash (Bourne Again SHell) является одной из наиболее часто используемых оболочек Unix/Linux и является оболочкой по умолчанию во многих дистрибутивах Linux.

Интерфейс оболочки zsh или командной строки выглядит следующим образом:

Оболочка принимает команды от пользователя и отображает вывод

В приведенном выше выводе clockber::~>> — это приглашение оболочки zsh. Когда оболочка используется в интерактивном режиме, в Linux она отображает $, когда ожидает команды от пользователя.

Если оболочка запущена от имени пользователя root (пользователь с правами администратора), приглашение меняется на #. Приглашение оболочки суперпользователя выглядит следующим образом:

[root@host ~]#

Хотя Bash — это тип оболочки, существуют и другие доступные оболочки, такие как оболочка Korn (ksh), оболочка C (csh) и оболочка Z (zsh). Каждая оболочка имеет свой собственный синтаксис и набор функций, но все они имеют общую цель — предоставить интерфейс командной строки для взаимодействия с операционной системой.

Вы можете определить свой тип оболочки с помощью команды ps:

Пример вывода моего терминала:

Проверка типа оболочки. Я использую оболочку zsh

Таким образом, в то время как «оболочка» — это широкий термин, относящийся к любой программе, предоставляющей интерфейс командной строки, «Bash» — это особый тип оболочки, который широко используется в системах Unix/Linux.

Примечание: в этом руководстве мы будем использовать оболочку «bash».

Как начать работать с Bash-скриптами

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

[user@host ~]$

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

Как правило, команды имеют следующий синтаксис:

command [OPTIONS] arguments

Давайте рассмотрим несколько основных команд bash и посмотрим их результаты. Обязательно попробуйте выполнить их в своем терминале.

  • date : отображает текущую дату
admin@user-new:/$ date Sat 25 Mar 2023 14 12:04:17 PM MSK
  • pwd : Отображает текущий рабочий каталог.
admin@user-new:/usr/lib$ pwd /usr/lib
  • ls : Выводит содержимое текущего каталога.
admin@user-new:/home$ ls clockber
  • echo : Выводит на терминал строку текста или значение переменной.
admin@user-new:/home$ echo "Hello bash" Hello bash

Вы всегда можете обратиться к руководству по командам с помощью команды man.

Например, руководство по echo выглядит примерно так:

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

Соглашения об именах сценариев

По соглашению об именах сценарии bash заканчиваются на .sh. Однако сценарии bash могут прекрасно работать без расширения sh.

Добавляем Шебанг(Shebang)

Скрипты Bash начинаются с шебанга. Шебанг(Shebang) — это комбинация bash # и bang ! за которым следует путь оболочки bash. Это первая строка скрипта. Шебанг говорит оболочке выполнить его через оболочку bash. Shebang — это просто абсолютный путь к интерпретатору bash.

Ниже приведен пример оператора шебанг.

#!/bin/bash

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

which bash

Наш первый bash-скрипт

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

Создайте файл с именем show_all.sh с помощью команды vi . Вы можете использовать любой редактор по вашему выбору.

vi show_all.sh

Добавьте следующие команды в свой файл и сохраните его:

#!/bin/bash echo "сегодня " `date` echo -e "\n введите путь к директории:" read path_to echo -e "\n ваша директория содержит файлы и папки:" ls $path_to

Скрипт отобразит текущую дату и содержимое предоставленного пользователем каталога.

Давайте более подробно рассмотрим сценарий построчно. Я снова привожу тот же сценарий, но на этот раз с номерами строк.

#!/bin/bash echo "Сегодня " `date` echo -e "\n введите путь к директории:" read path_to echo -e "\n ваша директория содержит файлы и папки:" ls $path_to
  • Строка #1: Шебанг (#!/bin/bash) указывает на путь к оболочке bash.
  • Строка #2: команда echo отображает текущую дату и время на терминале. Обратите внимание, что дата указана в обратных кавычках.
  • Строка #4: мы хотим, чтобы пользователь ввел правильный путь.Строка #5: Команда чтения считывает ввод и сохраняет его в переменной path_to.
  • строка #8: Команда lh берет переменную с сохраненным путем и отображает текущие файлы и папки.

Выполнение bash-скрипта

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

chmod u+x show_all.sh
  • chmod изменяет владельца файла для текущего пользователя u: .
  • +x добавляет права на выполнение текущему пользователю. Это означает, что пользователь, являющийся владельцем, теперь может запустить сценарий.
  • show_all.sh — это файл, который мы хотим запустить.

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

  • sh show_all.sh
  • bash show_all.sh
  • ./show_all.sh

Давайте посмотрим, как он работает��

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

Комментарии в сценариях bash

Комментарии начинаются с # в сценариях bash. Это означает, что любая строка, начинающаяся с #, является комментарием и будет игнорироваться интерпретатором.

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

Вот примеры комментариев:

# This is an example comment # Можно комментить на русском # These lines will be ignored by the interpreter

Переменные и типы данных в Bash

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

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

В Bash вы можете использовать и устанавливать значения переменных следующими способами:

  1. Назначьте значение напрямую:
country=Russia

2. Присвоение значение на основе вывода, полученного от программы или команды, используя подстановку команд. Обратите внимание, что $ требуется для доступа к значению существующей переменной.

same_country=$country

Чтобы получить доступ к значению переменной, добавьте $ к имени переменной.

admin@user-new:/$ country=Russia admin@user-new:/$ echo $country Russia admin@user-new:/$ new_country=$country admin@user-new:/$ echo $new_country Russia

Соглашения об именах переменных

В сценариях Bash следующие соглашения об именах переменных:

  1. Имена переменных должны начинаться с буквы или символа подчеркивания ().
  2. Имена переменных могут содержать буквы, цифры и символы подчеркивания ().
  3. Имена переменных чувствительны к регистру.
  4. Имена переменных не должны содержать пробелов или специальных символов.
  5. Используйте описательные имена, отражающие назначение переменной.
  6. Избегайте использования зарезервированных ключевых слов, таких как if, then, else, fi и т. д., в качестве имен переменных.

Вот несколько примеров допустимых имен переменных в Bash:

name count _var myVar MY_VAR

А вот несколько примеров недопустимых имен переменных:

2ndvar (начинается с цифры) my var (содержит пробел) my-var (содержит дефис)

Соблюдение этих соглашений об именах помогает делать сценарии Bash более читабельными и простыми в использовании.

Ввод и вывод в Bash-скриптах

Обработка входных данных

В этом разделе мы обсудим некоторые методы ввода данных в наши сценарии.

  1. Чтение пользовательского ввода и сохранение его в переменной

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

#!/bin/bash echo -e "\n Enter your name:" read the_name echo -e "\n welcome to Medium $the_name"

2. Чтение из файла

Этот код считывает каждую строку из файла с именем input.txt и выводит ее на терминал. Мы изучим циклы while позже в этой статье.

while read line do echo $line done < input.txt

3. Аргументы командной строки

В скрипте или функции bash $1 обозначает переданный начальный аргумент, $2 обозначает переданный второй аргумент и так далее.

Этот сценарий принимает имя в качестве аргумента командной строки и печатает персонализированное приветствие.

echo "Hello, $1!"

Мы передаем скрипту clockber как аргумент.

#!/bin/bash echo "Hello, $1!"

Отображение вывода

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

  1. Печать в терминал:
echo "Hello, World!"

Этой командой напечатаем текст “Hello, World!” в терминале.

2. Запись в файл:

echo "let's write text." > output.txt

Эта команда запишет текст “let’s write text.” в файл с именем output.txt. Обратите внимание, что оператор > перезапишет файл, если в нем уже есть содержимое.

3. Добавление в файл:

echo "More text." >> output.txt

Добавляем текст “More text.” в конец файла output.txt.

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

ls > files.txt

Перечисляем файлы в текущем каталоге и записываем вывод в файл с именем files.txt. Таким образом вы можете перенаправить вывод любой команды в файл.

Основные команды Bash (echo, read и т. д.)

Вот список некоторых наиболее часто используемых команд bash:

  1. cd : Изменение директории на другую.
  2. ls : Отображение содержимого в текущей директории.
  3. mkdir : Создание новой директории.
  4. touch : Создать новый файл.
  5. rm : Удаление файла или директории.
  6. cp : Копирование файла или директории.
  7. mv : Перемещение или переименование файла или директории.
  8. echo : Печать текста в терминал.
  9. cat : Читает данные из файла и выводит их на экран.
  10. grep : Поиск в файлах.
  11. chmod : Изменение прав доступа к файлу или директории.
  12. sudo : Запуск команд с правами администратора.
  13. df : Отображение дискового пространства.
  14. history : Отображение истории предыдущих комманд.
  15. ps : Отображение информации о запущенных процессах.

Условные операторы (if/else)

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

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

Можно использовать логические операторы, такие как AND -a и OR -o , чтобы делать сравнения, которые имеют большее значение.

if [ $a -gt 60 -a $b -lt 100 ]

Давайте рассмотрим пример сценария Bash, который использует операторы if , if-else , if-elif-else , чтобы определить, является ли введенное пользователем число положительным, отрицательным или нулевым:

#!/bin/bash echo "Please enter a number: " read num if [ $num -gt 0 ]; then echo "$num is positive" elif [ $num -lt 0 ]; then echo "$num is negative" else echo "$num is zero" fi

Сначала скрипт предлагает пользователю ввести число. Затем он использует оператор if , чтобы проверить, больше ли число, чем 0. Если это так, сценарий выводит, что число положительное. Если число не больше 0, скрипт переходит к следующему оператору, который является оператором if-elif . Здесь скрипт проверяет, меньше ли число 0. Если да, то скрипт выводит отрицательное число. Наконец, если число не больше 0 и не меньше 0, скрипт использует оператор else для вывода того, что число равно нулю.

Циклы и ветвление в Bash

Цикл While

Циклы while проверяют условие в цикле, пока это условие остается true . Для управления циклом принято использовать счетчики.

В приведенном ниже примере (( i += 1 )) — это оператор счетчика, который увеличивает значение i. Цикл будет выполняться ровно 10 раз.

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

Цикл For

Цикл for, как и цикл while, позволяет выполнять операторы определенное количество раз. Каждый цикл отличается своим синтаксисом и использованием.

В приведенном ниже примере цикл повторяется 5 раз.

#!/bin/bash for i in do echo $i done

Оператор Case

В Bash операторы case используются для сравнения заданного значения со списком шаблонов и выполнения блока кода на основе первого совпавщего шаблона. Синтаксис оператора case в Bash следующий:

case expression in pattern1) # code to execute if expression matches pattern1 ;; pattern2) # code to execute if expression matches pattern2 ;; pattern3) # code to execute if expression matches pattern3 ;; *) # code to execute if none of the above patterns match expression ;; esac

Здесь expression — это значение, которое мы хотим сравнить, а pattern1 , pattern2 , pattern3 и т. д. — это шаблоны, с которыми мы хотим его сравнить.

Двойная точка с запятой “;;” отделяет каждый блок кода для выполнения для каждого шаблона. Звездочка “*” представляет случай по умолчанию, который выполняется, если ни один из указанных шаблонов не соответствует выражению.

Давайте посмотрим пример.

fruit="apple"case in "apple") echo "This is a red fruit." ;; "banana") echo "This is a yellow fruit." ;; "orange") echo "This is an orange fruit." ;; *) echo "Unknown fruit." ;;esac

В данном примере, поскольку значение “fruit” является “apple”, чему соответствует первый шаблон и блок кода, следовательно в терминале мы увидем “This is a red fruit.”. Если бы значением “fruit” было “banana”, второй шаблон соответствовал бы и блоку кода, который повторяет “This is a yellow fruit.”. будет выполняться и так далее. Если значение “fruit”не соответствует ни одному из указанных шаблонов, выполняется случай по умолчанию, который повторяет “Unknown fruit.”.

Планирование сценариев с помощью Сron

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

Ниже приведен синтаксис для планирования crons:

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

Здесь * представляют собой минуты (минуты), часы (часы), день (дни), месяцы и дни недели соответственно.

Ниже приведены несколько примеров планирования заданий cron.

schedule description example0 0 * * * Run a script at midnight every day 0 0 * * * /path/to/script.sh*/5 * * * * Run a script every 5 minutes */5 * * * * /path/to/script.sh0 6 * * 1-5 Run a script at 6 am from Monday to Friday 0 6 * * 1-5 /path/to/script.sh0 0 1-7 * * Run a script on the first 7 days of every month 0 0 1-7 * * /path/to/script.sh0 12 1 * * Run a script on the first day of every month at noon

Использование crontab
Утилита crontab используется для добавления и редактирования заданий cron.

crontab -l перечисляет уже запланированные сценарии для конкретного пользователя.

Вы можете добавлять и редактировать cron через crontab -e .

Вы можете прочитать больше о работе с Cron здесь.

Как отлаживать и устранять неполадки Bash-скриптов

Отладка и устранение неполадок являются важными навыками для любого Bash-скриптора. Хотя сценарии Bash могут быть невероятно мощными, они также могут быть подвержены ошибкам и неожиданному поведению. В этом разделе мы обсудим некоторые советы и методы по отладке и устранению неполадок сценариев Bash.

Установите параметр set -x

Один из наиболее полезных способов отладки сценариев Bash — установка параметра set -x в начале сценария. Эта опция включает режим отладки, в котором Bash печатает каждую команду, которую он выполняет, на терминал, перед которой ставится знак +. Это может быть невероятно полезно для определения того, где в сценарии возникают ошибки.

#!/bin/bashset -x# Your script goes here

Проверьте код выхода

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

#!/bin/bash# Your script goes hereif [ $? -ne 0 ]; then echo "Error occurred."fi

Используйте операторы echo

Другой полезный метод отладки скриптов Bash — вставка echo-оператора в ваш код. Это может помочь вам определить, где возникают ошибки и какие значения передаются в переменные.

#!/bin/bash# Your script goes hereecho "Value of variable x is: " >x"# More code goes here

Используйте опцию set -e

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

#!/bin/bashset -e# Your script goes here

Устранение неполадок Cron путем проверки log журналов

Мы можем устранять неполадки crons с помощью файлов журнала. Журналы ведутся для всех запланированных заданий. Вы можете проверить и проверить в журналах, выполнялось ли конкретное задание должным образом или нет.

Для Ubuntu/Debian вы можете найти cronlogs по адресу:

/var/log/syslog

Расположение отличается для других дистрибутивов.

Файл журнала заданий cron может выглядеть следующим образом:

2022-03-11 00:00:01 Task started2022-03-11 00:00:02 Running script /path/to/script.sh2022-03-11 00:00:03 Script completed successfully2022-03-11 00:05:01 Task started2022-03-11 00:05:02 Running script /path/to/script.sh2022-03-11 00:05:03 Error: unable to connect to database2022-03-11 00:05:03 Script exited with error code 12022-03-11 00:10:01 Task started2022-03-11 00:10:02 Running script /path/to/script.sh2022-03-11 00:10:03 Script completed successfully

Заключение

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

Надеюсь вся вышеперечисленная информация вам помогла 🙂

Учимся писать базовые скрипты в Unix и Linux

img

Если вы еще не умеете писать скрипты в системах Unix и Linux, эта статья познакомит с основами написания скриптов.

Учимся писать базовые скрипты в Unix и Linux

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

Идентификация оболочки.

Сегодня в системах Unix и Linux есть несколько оболочек, которые вы можете использовать. Каждая оболочка - это интерпретатор команд. Он считывает команды и отправляет их ядру для обработки.

Bash является одной из самых популярных оболочек, но существуют также zsh , csh , tcsh и korn . Есть даже оболочка под названием fish , которая может быть особенно полезна новичкам в Linux благодаря полезным параметрам автозаполнения команд. Чтобы определить, какую оболочку вы используете, используйте эту команду:

$ echo $SHELL /bin/bash

Вы также можете определить свою основную оболочку, просмотрев файл /etc/passwd :

$ grep $USER /etc/passwd nemo:x:1111:1111:Nemo the Fish:/home/nemo:/bin/bash

Один из способов определить, какие оболочки доступны в системе Linux, - это проверить файл /etc/shells .

$ more /etc/shells # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash /bin/zsh /usr/bin/zsh /usr/bin/screen /usr/bin/tmux /usr/bin/fish

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

Какую оболочку выбрать пользователю во многом зависит от того, что он привык использовать, поскольку большая часть синтаксиса в скриптах не представляет команды, которые вы найдете в /bin , /us /bin или /usr/local/bin . Вместо этого они являются частью самой оболочки и называются «встроенными». Сюда входят команды, используемые для цикла (например, for и while ).

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

Выбор оболочки

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

#!/bin/sh #!/bin/dash #!/bin/bash #!/bin/rbash #!/bin/zsh #!/usr/bin/zsh #!/usr/bin/screen #!/usr/bin/tmux #!/usr/bin/fish

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

Выполнение команд

Любую команду, которую вы запускаете в командной строке Linux, можно запустить в скрипте, если он совместим с указанной оболочкой. Используйте свой любимый текстовый редактор и вводите нужные для исполнения команды. Вот очень простой скрипт, который выводит текущую дату в формате день-месяц-год. Скрипт имеет название today .

#!/bin/bash date +”%d %B %Y”

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

$ today 15 April 2021

Добавление комментариев

Рекомендуется добавлять к скриптам комментарии, объясняющие, для чего предназначен скрипт, особенно если скрипт длинный или имеется сложный синтаксис. Просто начните комментарий со знака # . Комментарии могут быть отдельными строками или добавляться в конец команд в скрипте. Например:

#!/bin/bash # циклическое отображение даты/времени while true do echo -n “still running . ” date sleep 300 # sleep 5 minutes done

Делаем файл исполняемым

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

$ chmod 700 scriptname # только вы сможете его запустить $ chmod 755 scriptname # запустить его смогут все

Если скрипт не сделан как исполняемый, его все равно можно запустить с помощью символа . Это встроенная функция, которая «выполняет» (т. е. читает и запускает) скрипт.

$ . today 08 April 2021

Использование команды if

Команда if позволяет вам проверять условия или переменные. В примере ниже мы проверяем, запускается ли скрипт в пятницу.

if [ date +”%A” == Friday ];then echo “TGIF!”; fi

Базовый синтаксис команды if - if value == other_value . Знак == выполняет сравнение, и необходимо убедиться, что оболочка видит по одному значению с каждой стороны оператора сравнения. По этой причине часто приходится заключать свои строки в кавычки.

Понятие переменных

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

$ date=11 $ echo $date 11

Запрос пользователя на ввод данных

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

echo -n “Сколько циклов “ read numloops

Человек, запускающий сценарий, увидит приглашение и введет ответ :

Сколько циклов? 11

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

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

$!/bin/bash if [[ $1 != [0-9]* ]]; then echo “Ошибка: $1 это не число” exit else loops=$1 fi

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

Еще одна полезная вещь, которую нужно сделать в скрипте, - это сначала проверить наличие аргументов. В противном случае синтаксис, подобный показанному выше, не сработает, потому что оболочка увидит выражение if [[! = [0-9] *]]; , что приведет к синтаксической ошибке.

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

#!/bin/bash if [ $# -lt 2 ]; then echo “Usage: $0 lines filename” exit 1 fi

Различные способы создания циклов

Есть несколько способов сделать цикл внутри скрипта. Используйте for , если вы хотите повторить действие заданное количество раз. Например:

#!/bin/bash for day in Sun Mon Tue Wed Thu Fri Sat do echo $day done
#!/bin/bash for letter in do echo $letter done

Используйте while , если хотите выполнять какое-то действие, пока условие существует или не существует.

#!/bin/bash n=1 while [ $n -le 4 ] do echo $n ((n++)) done

Использование оператора case

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

#!/bin/bash if [ $# -eq 0 ]; then echo -n “myfile> “ read myfile else myfile=$1 fi if [ ! -f “$myfile” ]; then echo “Файл не найден: $myfile” exit fi case $myfilein *.tar) tar xf $myfile;; *.zip) unzip $myfile;; *.rar) rar x $myfile;; *) echo “Нет опций для извлечения $myfile” esac

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

Реакция на ошибки

Вы можете обнаруживать ошибки в скриптах и реагировать на них и тем самым избегать других ошибок. Хитрость заключается в том, чтобы проверять выходные коды после запуска команд. Если код выхода имеет значение, отличное от нуля, произошла ошибка. В этом скрипте проверяется, запущен ли Apache, но отправляем результат проверки в /dev/null . Затем проверяем, не равен ли код выхода нулю, поскольку это означает, что команда ps не получила ответа. Если код выхода не равен нулю, сценарий сообщает пользователю, что Apache не запущен.

#!/bin/bash ps -ef | grep apache2 > /dev/null if [ $? != 0 ]; then echo Apache is not running exit fi

27. bash скрипты №1

Изучать что-то новое может быть интересно - новые знания, новый опыт. Вот мы изучили рейд, лвм, файловые системы и всё такое, попрактиковались пару раз – всё довольно просто. Но вы устраиваетесь на работу, там есть какая-то инфраструктура и ваша задача – администрировать эту инфрастуктуру. И то что вчера было новым и интересным превращается в рутину – вам постоянно нужно работать с одними и теми же командами, изо дня в день, годами. Где-то пользователей создать и права настроить, где-то бэкап сделать, где-то ещё что. И люди ищут способы, как бы это всё автоматизировать. Автоматизировать графический интерфейс довольно сложно. Писать новую программу ради какой-то рутины не всегда стоит того. И тут текстовый интерфейс раскрывает себя во всей красе. Можно написать так называемые сценарии, какие команды и как будут выполняться. И запускать этот сценарий вручную, либо автоматизировать его запуск, что вообще позволит админу избавиться от рутины.

Мы работаем с bash, поэтому будем учиться писать сценарии для него. Более привычное название – скрипты. Кто-то называет это «bash программированием». И давайте сразу поставим себе задачу, которую будем решать с помощью скрипта. Начнём с чего-то простого – создать двух пользователей:

  1. Основная группа - it
  2. it – группа с правами суперпользователя
  3. Домашняя директория в /home/it
  4. Оболочка - /bin/bash
  1. Основная группа - users
  2. Домашняя директория в /home/users
  3. Оболочка - /sbin/nologin

Один из них — user1 - его основная группа будет it, у которой будут права суперпользователя, его домашняя директория будет внутри директории /home/it и его оболочка будет bash. Второй пользователь – user2 - будет в группе users, домашняя директория внутри директории /home/users, а оболочка nologin. Кстати, попробуйте самостоятельно вспомнить все команды, которые необходимо выполнить.

Для начала вспомним, как это делается. Во первых, нужно создать группы и директории. Создаём группу it:

sudo groupadd it 

Группа users есть по умолчанию:

grep users /etc/group 

У группы it должны быть права суперпользователя – заходим в:

visudo 

и добавляем строчку:

%it ALL=(ALL) ALL 

Дальше нам нужны директории - /home/it и /home/users:

sudo mkdir -v /home/it,users> 

И наконец создаём пользователей:

sudo useradd user1 -g it -b /home/it -s /bin/bash sudo useradd user2 -g users -b /home/users -s /sbin/nologin tail /etc/passwd 

Всего у нас получилось 5 команд:

sudo groupadd it sudo visudo sudo mkdir -v /home/it,users> sudo useradd user1 -g it -b /home/it -s /bin/bash sudo useradd user2 -g users -b /home/users -s /sbin/nologin 

Теперь давайте сделаем скрипт – просто вставим все эти 5 команд в файл с любым названием:

nano myscript 

Каждая команда с новой строки.

Но прежде чем запускать скрипт, надо вернуть всё как было – удаляем пользователей, группу, директории и запись из sudoers:

sudo userdel -r user1 sudo userdel -r user2 sudo groupdel it sudo rm -r /home/ sudo visudo sudo grep «%it» /etc/sudoers

Запускаем скрипт с помощью bash:

bash myscript 

У меня открылся visudo – это один из шагов, когда мне нужно добавить группу it в sudoers. Добавил, сохранил. Теперь опять проверяем:

tail /etc/passwd 

всё создалось. И это одной командной, не считая ручного заполнения visudo.

Но.. мы говорим про автоматизацию, а мне всё равно приходится добавлять запись в sudoers вручную. Давайте сделаем так, чтобы запись добавлялась без нашего участия. Помните, как мы делали с рейдом – писали echo текст и направляли в файл? Сделаем точно также. Заменим в нашем файле visudo на echo:

nano myscript 

echo %it ALL=(ALL) ALL

Возьмём текст в одинарные кавычки, чтоб баш никак не обработал команду и направим этот текст в файл /etc/sudoers:

echo '%it ALL=(ALL) ALL' >> /etc/sudoers 

с помощью двух символов больше, чтобы не перезаписать файл, а дополнить. Правда сама такая команда не сработает – перенаправление вывода (>>) выполняется от моей оболочки, не от команды sudo, а у моего пользователя не хватит прав записать что-то в sudoers.

sudo echo '%it ALL=(ALL) ALL' >> /etc/sudoers 

Можно, конечно, использовать команду tee, но, вообще, учитывая, что все команды тут выполняются с sudo, легче сделать по другому. Просто сотрём отсюда все sudo, а при запуске, вместо bash myscript будем писать:

sudo bash myscript 

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

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

nano myscript 

Хорошо, теперь опять удалим то что создали:

sudo userdel -r user1 sudo userdel -r user2 sudo groupdel it sudo rm -r /home/it,users> sudo visudo cp /etc/sudoers.bkp> 

И заново запустим скрипт:

sudo bash myscript tail -2 /etc/passwd sudo tail -1 /etc/sudoers 

Сработало – одной командой мы создали всё что нам нужно.

Чтобы наш скрипт выглядел более самостоятельным, то есть, чтобы нам не приходилось каждый раз перед ним писать bash, а также чтобы мы могли делиться этим скриптом с другими, кто, возможно, использует другие оболочки, мы можем внутри самого скрипта указать, а под какой именно интерпретатор написан скрипт. Так как, теоретически, у нас в скрипте могут быть всякие особенности, присущие только bash, которых нет в других интерпретаторах. Но тут могут быть нюансы – нужно понимать, что bash есть во многих системах, но не во всех. Если вы пишете скрипт, который предполагаете использовать не только на GNU/Linux, но и на всяких UNIX-ах, где может не быть bash-а, то лучше писать скрипты под интерпретатор shell. Чтобы указать, с помощью какого интерпретатора запускать скрипт, в первой строчке самого скрипта указываются два символа:

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

#!/bin/bash 

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

#!/usr/bin/env bash 

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

chmod +x myscript 
sudo myscript 

не получится – sudo будет искать программу myscript в директориях её переменной PATH. Либо нужно поместить myscript в одну из директорий переменной PATH, либо явно указывать путь к этому скрипту – достаточно поставить перед ним точку и слеш, если он в текущей директории:

sudo ./myscript 

Но наш скрипт получился слишком однозадачным – он нацелен на создание двух конкретных пользователей. Сойдёт на разок, но потом, если понадобится создать ещё пользователей, придётся изменять скрипт. Давайте сделаем наш скрипт более динамическим – добавим в него переменные. Пользователей и группы заменим на переменные – user1,user2,group1,group2, а так как директории совпадают с именами групп, там тоже используем переменные. В строке echo одинарные кавычки, а значит переменная не обработается. Надо немного переделать строчку. Можно по разному, но я просто оставлю переменную group1 за кавычками. Теперь, если мне понадобится выполнить скрипт для других пользователей и групп, я могу просто заменить в начале скрипта значения переменных, вместо того, чтобы переделывать весь скрипт.

Опять же получилось так себе – у нас тут скрипт на двух пользователей в двух группах – а если мне нужно добавить одного или трёх пользователей? Давайте уберём всё что касается user2 и group2. Конечно, для второго пользователя придётся опять запускать скрипт, но динамичность скрипта это компенсирует.

Хотя.. в скрипте всё ещё вручную прописаны переменные user и group. Придётся для каждого пользователя заходить и менять значения. Обычно, когда мы работаем с программами в командной строке, мы передаём ей какие-то параметры. Нельзя ли пользователя и группу передать в виде параметров, чтоб не приходилось менять скрипт? Можно.

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

nano test 

сохраним и дадим права:

Написание скриптов на Bash

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

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

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

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

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

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

#!/bin/bash
echo "Hello world"

bash1

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

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

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

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

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

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

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

bash

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

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

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

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

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

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

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

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

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

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

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

bash2

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

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

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

$( команда )

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

bash3

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

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

bash4

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

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

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

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

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 рассчитаны на запись в несколько строк, и если вы попытаетесь их записать в одну строку, то получите ошибку. Но тем не менее это возможно, для этого там, где должен быть перевод строки ставьте точку с запятой ";". Например, предыдущий цикл можно было выполнить в виде одной строки:

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

Выводы

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *