Работа с командной строкой Linux & Shell скрипты для начинающих
В Linux автоматизация процессов в значительной степени решается исполняемыми скриптами в shell оболочке. Это подразумевает под собой создание файла, содержащего ряд команд, которые исполняются последовательно.
В этой статье мы обсудим основы написания сценариев bash, включая переменные, команды, ввод/вывод и отладку. Каждый пункт сопроводим примерами.
Начнем.
Оглавление
Определение Bash-скрипта
Преимущества Bash-скриптов
Обзор оболочки Bash и интерфейса командной строки
3. Как начать работать с Bash-скриптами
Как запускать команды Bash из командной строки
Комментарии в сценариях bash
Переменные и типы данных в Bash
Цикл While
Цикл For
Оператор Case
6. Планирование сценариев с помощью Сron
7. Отладка и устранение неполадок Bash-скриптов
8. Заключение
Минимальные требования
Чтобы следовать этому руководству, необходимо иметь следующее:
Работающая версия 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:
ps
Пример вывода моего терминала:
Таким образом, в то время как «оболочка» — это широкий термин, относящийся к любой программе, предоставляющей интерфейс командной строки, «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 вы можете использовать и устанавливать значения переменных следующими способами:
Назначьте значение напрямую:
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 следующие соглашения об именах переменных:
Имена переменных должны начинаться с буквы или символа подчеркивания ().
Имена переменных могут содержать буквы, цифры и символы подчеркивания ().
Имена переменных чувствительны к регистру.
Имена переменных не должны содержать пробелов или специальных символов.
Используйте описательные имена, отражающие назначение переменной.
Избегайте использования зарезервированных ключевых слов, таких как if, then, else, fi и т. д., в качестве имен переменных.
Вот несколько примеров допустимых имен переменных в Bash:
name
count
_var
myVar
MY_VAR
А вот несколько примеров недопустимых имен переменных:
2ndvar (начинается с цифры)
my var (содержит пробел)
my-var (содержит дефис)
Соблюдение этих соглашений об именах помогает делать сценарии Bash более читабельными и простыми в использовании.
Ввод и вывод в Bash-скриптах
Обработка входных данных
В этом разделе мы обсудим некоторые методы ввода данных в наши сценарии.
Чтение пользовательского ввода и сохранение его в переменной
Мы можем прочитать пользовательский ввод с помощью команды чтения.
#!/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!"
вывод:
Отображение вывода
Здесь мы обсудим некоторые методы получения вывода из скриптов.
Печать в терминал:
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:
cd
: Изменение директории на другую.ls
: Отображение содержимого в текущей директории.mkdir
: Создание новой директории.touch
: Создать новый файл.rm
: Удаление файла или директории.cp
: Копирование файла или директории.mv
: Перемещение или переименование файла или директории.echo
: Печать текста в терминал.cat
: Читает данные из файла и выводит их на экран.grep
: Поиск в файлах.chmod
: Изменение прав доступа к файлу или директории.sudo
: Запуск команд с правами администратора.df
: Отображение дискового пространства.history
: Отображение истории предыдущих комманд.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 {1..5}
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: " class="formula inline">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, а затем некоторые методы устранения неполадок.
Надеюсь вся вышеперечисленная информация вам помогла :)