Сценарий Bash — как использовать аргументы командной строки

Опубликовано: 30 Сентября, 2022

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

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

Аргументы командной строки передаются позиционно, т.е. так же, как они передаются при выполнении программы. Давайте посмотрим на примере.

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

Программу можно запустить с помощью команды «sh».

sh <script filename> arg1 arg2 arg3 ......

Итак, наш код исполнения станет

sh displayPositionalArgument.sh Welcome To GeeksForGeeks

Схематическое представление приведенного выше кода:

Всегда первый аргумент начинается после <имя файла сценария>. <имя файла сценария> будет в 0-м месте. Нам нужно взять позиционные аргументы после <имя файла сценария>. Следовательно, в приведенном выше примере

$1-> "Welcome"
$2-> "To"
$3-> "GeeksForFeeks"

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

Вывод приведенного выше кода:

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

Специальная переменная Детали специальной переменной
$1 … $n Позиционный аргумент, указывающий от 1 .. n. Если аргумент похож на 10, 11 и далее, он должен быть указан как ${10},${11
$0 Это не учитывается в списке аргументов, так как указывает «имя» программы-оболочки. В приведенном выше примере $0 — это «displayPositionalArgument.sh».
$@ Значения аргументов, которые передаются в программе. Это будет очень полезно, если мы не уверены в количестве переданных аргументов.
$# Общее количество аргументов, и это хороший подход для концепций цикла.
$* Чтобы получить все аргументы в двойных кавычках, мы можем следовать этому пути
$$ Чтобы узнать об идентификаторе процесса текущей оболочки
$? и $! Идентификатор состояния выхода и идентификатор процесса последней команды

Использование флагов

Аргументы можно передавать вместе с флагами. Аргументы можно обозначить одной буквой, имеющей - перед этим. Одна буква может иметь значение, и здесь возьмем -1, -2 и -3.

Нам нужно использовать функцию getopts для чтения флагов на входе, а OPTARG ссылается на соответствующие значения:

Вышеупомянутая программа может быть выполнена как

sh usingFlags.sh -1 ‘GeeksForGeeks’ -2 ‘JavaProgramming’ -3 100

Выход

Использование циклов с $@ — циклические конструкции

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

Выход :

Другой способ — использовать оператор Shift вместо $@ — оператор Shift:

Переменная $# используется для возврата размера ввода. Используя это и оператор сдвига, мы можем добиться вместо $@

Выход:

Общий сценарий использования с использованием оператора Shift:

Предположим, что в аргументах команды мы можем передать аргумент «-d», который не что иное, как знать, что это каталог.

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

Затем отобразите соответственно, является ли аргумент каталогом или файлом

Пусть скрипт будет называться «shiftArgument.sh».

sh  shiftArgument.sh -d /home shiftArgument.sh 

Выход:

Приведенный выше код будет проверять «/home» как каталог, поскольку у нас есть «-d» в качестве первого позиционного аргумента, и, следовательно, выполняется оператор сдвига, а следующий аргумент проверяется, чтобы увидеть, является ли он каталогом. Если нет аргумента «-d» в качестве предыдущего, он просто проверяет «является ли этот аргумент файлом или нет».

Вывод

Мы можем передавать аргументы командной строки по своему усмотрению позиционно или с помощью флагов. Кроме того, доступны такие полезные понятия, как $@ (массив всех параметров), $# (путем вычисления размера ввода), и с этим мы можем выполнять итерации в циклах «for» или «пока», мы можем получить доступ к аргументам.