Поиск по сайту:

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


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

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

1. Создайте простой сценарий оболочки

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

Мы начнем с создания простого сценария, который при выполнении отображает «Hello world».

vim hello.sh

Вставьте следующее содержимое в файл и сохраните.

#!/bin/bash
Print Hello world message
echo "Hello World!"

Давайте рассмотрим сценарий оболочки построчно.

  • Первая строка — #!/bin/bash — известна как заголовок shebang. Это специальная конструкция, указывающая, какая программа будет использоваться для интерпретации сценария. В данном случае это будет оболочка bash, обозначенная /bin/bash. Существуют и другие языки сценариев, такие как Python, который обозначается #!/usr/bin/python3 и Perl, чей заголовок shebang обозначается #!/usr/bin/perl.
  • Вторая строка — комментарий. Комментарий — это оператор, который описывает действие сценария оболочки и не выполняется при запуске сценария. Комментарии всегда предваряются знаком решетки #.
  • Последняя строка — это команда, которая печатает сообщение «Hello World» на терминале.

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

chmod +x  hello.sh

Наконец, запустите сценарий оболочки, используя любую из команд:

bash hello.sh
OR
./hello.sh

2. Использование условных операторов для выполнения кода

Как и в других языках программирования, условные операторы используются в сценариях bash для принятия решений с небольшими изменениями в синтаксисе. Мы собираемся рассмотреть условные операторы if, if-else и elif.

Пример только оператора if

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

if command
then
  statement
fi

Давайте посмотрим на сценарий оболочки ниже.

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

Приведенный выше сценарий оболочки предлагает пользователю ввести оценку, которая затем сохраняется в переменной x. Если оценка соответствует 70, сценарий возвращает вывод «Хорошая работа!». Оператор сравнения == используется для проверки того, эквивалентен ли введенный балл, хранящийся в переменной x, значению 100.

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

  • -eq – равно
  • -ne – Не равно
  • -lt – Меньше чем
  • -le – Меньше или равно
  • -lt – Меньше чем
  • -ge – больше или равно

Например, блок if-statement ниже выводит «Работай усерднее», если входной балл меньше 50.

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

Пример оператора if-else

В ситуациях, когда у вас есть два возможных результата: то или это, оператор if-else пригодится.

if command
then
  statement1
else
  statement2
fi

Сценарий ниже считывает входной балл и проверяет, больше или равен он 70.

Если оценка больше или равна 70, вы получите сообщение «Отличная работа, вы прошли!». Однако если оценка упадет ниже 70, будет напечатан вывод «Вы не справились».

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

Пример оператора if-elif-else

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

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

Например, у нас есть сценарий лотереи, который проверяет, является ли введенное число 90, 60 или 30.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. Использование оператора if с логикой AND

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

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. Использование оператора if с логикой OR

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

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

Используйте циклические конструкции

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

Пока цикл

Это один из самых простых в работе циклов. Синтаксис довольно прост:

while  <some test>
do
 commands
done

Приведенный ниже цикл while перечисляет все числа от 1 до 10 при выполнении.

#!/bin/bash
A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

Давайте обсудим цикл while:

Переменная counter инициализируется значением 1. И пока переменная меньше или равна 10, значение счетчика будет увеличиваться до тех пор, пока условие не будет выполнено. Строка echo $counter печатает все числа от 1 до 10.

Для цикла

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

Синтаксис:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

Приведенный ниже цикл for выполняет итерацию от 1 до 10 и обрабатывает их значения на экране.

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

#!/bin/bash
Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Позиционные параметры Bash

Позиционный параметр — это специальная переменная, на которую ссылается сценарий, когда значения передаются в оболочку, но не могут быть назначены. Позиционные параметры варьируются от $0 $1 $2 $3 …… до $9. За пределами значения $9 параметры должны быть заключены в фигурные скобки, например $ {10}, $ {11} … и т. д.

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

Давайте создадим скрипт test.sh, как показано.

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

Затем выполните скрипт и укажите имя и второе имя в качестве аргументов:

bash test.sh James Kiarie

Из вывода мы видим, что первая выводимая переменная — это имя сценария оболочки, в данном случае test.sh. После этого распечатываются имена, соответствующие позиционным параметрам, определенным в сценарии оболочки.

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

Коды выхода команд оболочки

Давайте начнем с ответа на простой вопрос: что такое код выхода?

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

Статус завершения 0 означает, что команда выполнена успешно и без ошибок. Любое значение от 1 до 255 означает, что команда не выполнена или выполнена неудачно.

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

Статус выхода 1 указывает на общую ошибку или любые недопустимые ошибки, такие как редактирование файлов без разрешений sudo.

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

Статус выхода 127 указывает на недопустимую команду, которая обычно приводит к ошибке «команда не найдена».

Обработка вывода команд оболочки в сценарии

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

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

Например, вы можете сохранить команду date в переменной с именем today и вызвать сценарий оболочки, чтобы узнать текущую дату.

#!/bin/bash

today=$(date)

echo “Today is $today”

Давайте возьмем другой пример. Предположим, вы хотите найти действительных пользователей для входа в вашу систему Linux. Как бы вы это сделали? Во-первых, список всех пользователей (как системных, так и процессных и входящих в систему) хранится в файле /etc/passwd.

Чтобы просмотреть файл, вам нужно использовать команду cat. Однако, чтобы сузить круг пользователей для входа в систему, используйте команду grep для поиска пользователей с атрибутом /bin/bash и используйте команду cut -c 1-10 как показано для отображения первых 10 символов имен.

Мы сохранили команду cat в переменной login_users.

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

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