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

ShellBeginner
Практиковаться сейчас

Введение

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

Создание нового файла скрипта

Начнем с создания нового файла для нашего скрипта. Для этой работы мы будем использовать встроенную среду разработки WebIDE (на базе VS Code).

  1. Откройте WebIDE, если она еще не открыта.
  2. В проводнике файлов слева перейдите в директорию /home/labex/project.
  3. Нажмите правой кнопкой мыши в области проводника и выберите "New File" (Новый файл).
  4. Назовите файл arguments.sh.

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

#!/bin/bash

## Your code will go here

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

Для начинающих: строка shebang важна, так как она позволяет запускать скрипт напрямую (например, ./arguments.sh) вместо того, чтобы каждый раз вводить bash arguments.sh. Это небольшая деталь, которая делает использование ваших инструментов гораздо удобнее.

Доступ к аргументам скрипта

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

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

Добавьте следующий код в файл arguments.sh:

#!/bin/bash

echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"

Этот скрипт выведет свое имя и первые три параметра, которые вы укажете при запуске.

Для начинающих:

  • Символ $ используется в bash для обращения к значениям переменных.
  • $0, $1, $2 и прочие — это зарезервированные переменные, которые bash заполняет автоматически при запуске скрипта с параметрами.
  • Если запустить скрипт без аргументов, переменные $1, $2 и $3 будут пустыми, но скрипт все равно выполнится без ошибок.

Настройка прав на выполнение

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

cd /home/labex/project
chmod +x arguments.sh

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

Для начинающих:

  • chmod расшифровывается как "change mode" (изменить режим). Она используется для настройки прав доступа к файлам и папкам.
  • Опция +x добавляет право на исполнение (execute). Без этого bash не сможет запустить файл как скрипт.
  • Если пропустить этот шаг, при попытке запуска вы получите ошибку "permission denied" (отказано в доступе).

Запуск скрипта с аргументами

Теперь, когда наш скрипт готов к работе, давайте запустим его, передав несколько параметров. Введите в терминале следующую команду:

./arguments.sh hello world example

Вы должны увидеть вывод, похожий на этот:

Script name: ./arguments.sh
First argument: hello
Second argument: world
Third argument: example

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

Для начинающих:

  • Префикс ./ перед именем файла указывает bash искать скрипт в текущей директории.
  • Каждое слово после имени скрипта становится отдельным аргументом. В данном примере "hello" — это первый аргумент, "world" — второй, а "example" — третий.
  • Если вы хотите передать аргумент, содержащий пробелы, его нужно заключить в кавычки: ./arguments.sh "hello world" example.

Обработка количества аргументов

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

Обновите содержимое arguments.sh следующим кодом:

#!/bin/bash

if [ $## -eq 0 ]; then
  echo "No arguments provided."
elif [ $## -eq 1 ]; then
  echo "One argument provided: $1"
elif [ $## -eq 2 ]; then
  echo "Two arguments provided: $1 and $2"
else
  echo "More than two arguments provided:"
  echo "First argument: $1"
  echo "Second argument: $2"
  echo "Third argument: $3"
  echo "Total number of arguments: $#"
fi

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

Для начинающих:

  • $# — это счетчик всех аргументов, переданных скрипту.
  • [ $## -eq 0 ] — условие, проверяющее, равно ли количество аргументов нулю.
  • elif — сокращение от "else if" (иначе если). Позволяет проверять несколько условий последовательно.
  • Оператор -eq означает "equal to" (равно). Также существуют операторы -lt (меньше), -gt (больше) и другие.

Тестирование обновленного скрипта

Проверим, как работает обновленный скрипт с разным набором параметров:

./arguments.sh
./arguments.sh one
./arguments.sh one two
./arguments.sh one two three four

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

Для начинающих:

  • Запуск без аргументов (./arguments.sh) активирует первое условие в коде.
  • Каждая последующая команда демонстрирует, как скрипт адаптируется к разному объему входных данных.
  • Такая гибкость крайне важна в реальных сценариях автоматизации, когда скрипт должен уметь обрабатывать ошибки ввода или работать в разных режимах.

Перебор всех аргументов в цикле

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

Обновите arguments.sh следующим образом:

#!/bin/bash

echo "Total number of arguments: $#"
echo "All arguments:"

count=1
for arg in "$@"; do
  echo "Argument $count: $arg"
  count=$((count + 1))
done

В этом примере используется цикл for для последовательного прохода по всем аргументам и их вывода с порядковым номером.

Для начинающих:

  • $@ — специальная переменная, содержащая все аргументы командной строки как список.
  • Цикл for используется для повторения действий над каждым элементом списка.
  • $((count + 1)) — это арифметическое расширение в bash. Оно используется для увеличения значения переменной-счетчика.
  • Эта версия скрипта универсальна: она будет корректно работать и с одним, и со ста аргументами.

Тестирование финальной версии

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

./arguments.sh apple banana cherry date

Вывод должен быть примерно таким:

Total number of arguments: 4
All arguments:
Argument 1: apple
Argument 2: banana
Argument 3: cherry
Argument 4: date

Это доказывает, что теперь наш скрипт способен обрабатывать любое количество входных данных.

Для начинающих:

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

Резюме

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

  1. Создание скрипта и настройка прав на его выполнение.
  2. Доступ к отдельным параметрам через специальные переменные ($1, $2 и т.д.).
  3. Использование переменной $# для определения общего количества аргументов.
  4. Реализация условной логики для обработки различных сценариев ввода.
  5. Использование переменной $@ и циклов для обработки неограниченного количества аргументов.

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