Сценарии оболочки в Linux позволяют писать программы с жестко запрограммированными значениями и программы, которые могут принимать вводимые пользователем данные во время выполнения. Эти вводимые пользователем данные известны как параметры или аргументы. Все мы обычно знакомы с передачей обычных аргументов сценариям оболочки. Однако иногда вы можете почувствовать необходимость передавать «именованные аргументы» в ваши сценарии оболочки. Эта статья расскажет вам больше о том, что именно называют аргументами и их потребностями в сценариях оболочки. После этого мы поделимся обширным примером передачи именованных аргументов в сценарий оболочки в Ubuntu 20.04.
К настоящему времени мы ясно понимаем, что можем легко написать такие сценарии оболочки в Ubuntu 20.04, которые могут принимать аргументы в качестве входных данных от пользователя при выполнении этих сценариев из терминала. Однако в сценариях оболочки также часто используется другой тип аргументов, известный как «именованные аргументы». Именованный аргумент – это тот, который символизируется парой «имя-значение». Эта пара «имя-значение» определяется в сценарии оболочки, и соответствующий аргумент передается таким же образом при выполнении сценария, как и обычные аргументы.
Тогда каково значение использования названных аргументов в сценариях оболочки? Ну, иногда вы определяете аргументы в своих сценариях оболочки, но при запуске этих сценариев вам может не обязательно указывать все эти аргументы. Именованные аргументы позволяют вам пропустить значения любого количества этих аргументов при запуске вашего скрипта. В этом случае, если бы вы использовали обычные аргументы, ваша система выдала бы сообщение об ошибке и не позволила бы вам продолжить выполнение вашего скрипта, если бы вы пропустили какие-либо заранее определенные аргументы в своем скрипте.
Более того, иногда вы также можете изменить порядок передачи аргументов при запуске сценария оболочки, т. е. вы передаете аргументы в случайном порядке вместо того, который используется при объявлении переменных в сценарии оболочки. Именованные аргументы легко позволяют вам это сделать, тогда как, с другой стороны, если бы вы использовали обычные аргументы в этой ситуации, опять же, сообщение об ошибке было бы сгенерировано из-за несоблюдения правильного порядка аргументов. Следовательно, вы можете сказать, что названные аргументы обеспечивают большую гибкость для пользователей, предоставляя входные данные, а не ограничивая их.
Теперь, когда вы осознаете важность использования именованных аргументов в сценариях оболочки, давайте посмотрим, как мы можем использовать эти аргументы в сценарии оболочки в системе Ubuntu 20.04.
Для передачи именованных аргументов в сценарий оболочки в Ubuntu 20.04 мы разработали сценарий оболочки, который показан на изображении ниже. В этом разделе мы будем выполнять этот сценарий оболочки с другими аргументами или входными значениями.
#!/bin/bash while getopts n:a:g: flag do case "${flag}" in n) name=$(OPTARG);; a) age=$[OPTARG];; g) gender=s{OPTARG};; esac done echo "Имя: $name"; echo "Возраст: $age"; echo "Пол: $gender";
В этом сценарии оболочки мы использовали встроенную функцию «getopts» в оболочке внутри цикла while. Эта функция в основном принимает именованные параметры в качестве входных данных от пользователя. Затем мы определили три разных случая, то есть «n, a и g», соответствующие нашим переменным «Имя, Возраст и Пол» соответственно. Эти случаи определяются по переменной «flag», с которой будет выполняться наш оператор case-esac. Оператор case-esac в оболочке в основном эквивалентен оператору Switch в C. Затем внутри блока case-esac мы перечислили все три случая, которые были объявлены ранее, то есть n, a и g. В каждом случае мы объявили переменную, которая равна аргументу, предоставленному пользователем в качестве входных данных при выполнении скрипта. Каждый аргумент, предоставленный пользователем, будет назначаться соответствующей переменной каждый раз при выполнении этого скрипта. Затем у нас, наконец, есть три команды echo, предназначенные для вывода значений переменных name, age и пола соответственно.
После разработки этого сценария мы сначала выполним его с аргументами с обычными именами в правильном порядке, как показано ниже:
$ bash Named.sh –n AndreyEx –a 35 –g Male
Здесь Named.sh представляет имя нашего сценария оболочки. Более того, вы можете видеть из этой команды, что мы перечислили сначала флаги, а затем их соответствующие аргументы, которые необходимо передать. Кроме того, вы можете ясно заметить, что мы передали эти аргументы в том порядке, в котором они были определены в нашем сценарии оболочки.
Теперь, когда этот сценарий оболочки будет выполнен, вы сможете увидеть значения, присвоенные всем вашим именованным параметрам на терминале.
После того, как мы выполнили этот сценарий в обычном потоке, мы можем попробовать небольшой эксперимент, выполнив этот сценарий оболочки с теми же входными значениями, но в немного другом порядке, как показано в следующей команде:
$ bash Named.sh –n AndreyEx –g Male –a 35
Вы можете видеть в этой команде, что мы изменили порядок аргументов пола и возраста по сравнению с тем, который был изначально определен в сценарии оболочки. Теперь мы попытаемся выяснить, правильно ли эти значения присвоены нашим именованным аргументам или нет.
Когда эта команда будет выполнена, вы сможете увидеть из ее вывода, что независимо от порядка, в котором аргументы передаются при выполнении сценария оболочки, они все равно будут назначены правильным переменным.
В некоторых ситуациях пользователь может не захотеть раскрывать свой возраст. В этой ситуации он/она выполнит этот сценарий оболочки следующим образом:
$ bash Named.sh –n AndreyEx –g Male
В выводе этого сценария оболочки, когда он выполняется с аргументами, показанными выше, вы можете ясно видеть, что наша система не генерировала никаких сообщений об ошибках; скорее, он плавно выполнил наш скрипт с предоставленными параметрами, оставив пустую переменную Age.
Таким же образом вы также можете попробовать пропустить переменную Gender, указав только значение переменной Name, как показано ниже:
$ bash Named.sh –n AndreyEx
Наконец, мы попытаемся выполнить этот скрипт без каких-либо аргументов, а именно:
$ bash Named.sh
Опять же, из следующего вывода видно, что сообщение об ошибке не создается; скорее, наш сценарий успешно выполнен даже без каких-либо аргументов.
Из подробного примера, обсуждаемого в этой статье, мы можем сделать вывод, что он все равно будет успешно выполняться независимо от порядка именованных аргументов, предоставленных сценарию оболочки. Более того, даже если вы не предоставите своему скрипту никаких аргументов, он все равно может быть выполнен без ошибок. Однако единственное, о чем вам нужно быть осторожным при передаче именованных аргументов, – это использовать правильный флаг, за которым следует его соответствующее значение, при выполнении вашего сценария оболочки.