Значения аргументов командной строки могут быть переданы в сценарии Bash двумя способами. Один из способов — использовать позиционные аргументы, такие как $1, $2, $3 и т. д. Другой способ — использовать именованные аргументы. Использование позиционного аргумента не так полезно для доступа к значениям аргумента, потому что четко не определено, какой позиционный аргумент содержит какой тип данных. Но осмысленную опцию можно использовать с именованным аргументом, что помогает понять, какой аргумент содержит данные какого типа. В этом руководстве показано использование именованных аргументов в Bash.
И getopts, и getopt используются в Bash для чтения именованных значений аргументов. Но между этими инструментами есть разница. Getopts используется для чтения коротких параметров, таких как -h, -d и т. д. Но он не может читать длинные параметры, такие как –version, –user и т. д. Getopt используется для чтения значения длинного параметра.
Пример 1. Чтение именованных аргументов с помощью Getopts
Создайте файл Bash со следующим сценарием, который считывает два именованных аргумента с помощью getopts, поддерживающих короткие параметры. Опции -i и -r используются для передачи именованных значений аргументов во время выполнения скрипта. Затем значение аргумента, которое считывается с помощью опции -i, сверяется с определенным значением, чтобы напечатать вывод на основе совпадающего значения.
#Чтение значений аргументов на основе опций while getopts "i:r:" var do case "$var" in i) ID=${OPTARG};; r) GPA=${OPTARG};; esac done #Вывести сообщение на основе соответствующего значения идентификатора, переданного в аргументе if [[ "$ID" == "56" ]]; then echo "Mir Sabbir получил $GPA" elif [[ "$ID" == "34" ]]; then echo "Nirob Ahsan получил $GPA" else echo "ID недействителен." fi
Сценарий выполняется дважды в следующем выводе. Скрипт выполняется без каких-либо аргументов при первом выполнении. Итак, сообщение об ошибке отображается. Сценарий выполняется с двумя допустимыми именованными аргументами во втором выполнении. Отформатированные значения именованных значений аргументов печатаются в выводе:
andreyex@andreyex:~$ bash namedarg1.bash ID недействителен. andreyex@andreyex:~$ bash namedarg1.bash -i 56 -r 3.78 Mir Sabbir получил 3.78 andreyex@andreyex:~$
Пример 2. Чтение именованных аргументов с помощью Getopt
Создайте файл Bash со следующим сценарием, который считывает два именованных аргумента с помощью getopt, поддерживающего длинные параметры. Параметры –email и –pass используются для передачи именованных значений аргументов во время выполнения скрипта. Значения аргументов, которые считываются именованными аргументами, хранятся в двух переменных с именами $Email и $Password. Затем значения этих переменных сравниваются с конкретными значениями и распечатываются выходные данные на основе результатов сравнения.
#!/bin/bash #Установить параметры команды getopt format=$(getopt -n "$0" -l "email:,pass:" -- -- "$@") if [ $# -lt 3 ]; then echo "Передано неправильное количество аргументов." exit fi eval set -- "$format" #Прочитайте значения аргументов while [ $# -gt 0 ] do case "$1" in --email) Email="$2"; shift;; --pass) Password="$2"; shift;; --) shift;; esac shift; done #Сравните значения аргумента с конкретным значением if [[ "$Email" == "admin@example.com" && "$Password" == "secretpass" ]]; then echo "Действительный пользователь" else echo "Неверный пользователь" fi
Сценарий выполняется трижды в следующем выводе. Скрипт выполняется без каких-либо аргументов при первом выполнении. Итак, выдается сообщение об ошибке «Передано неправильное количество аргументов». Сценарий выполняется с двумя значениями аргументов во втором выполнении, но значение второго аргумента не соответствует значению пароля. Итак, выдается сообщение «Неверный пользователь». Сценарий выполняется с двумя допустимыми именованными аргументами в третьем выполнении, и значения обоих аргументов совпадают со значениями, указанными в условии «если». Итак, отображается сообщение «Действительный пользователь».
andreyex@andreyex:-$ bash namedarg2.bash Передано неправильное количество аргументов. andreyex@andreyex:-$ bash namedarg2.bash --email " admin@example.com " --pass "secret" Invalid user andreyex@andreyex:-$ bash namedarg2.bash --email " admin@example.com " --pass "secretpass" Действительный пользователь andreyex@andreyex:-$
Пример 3. Чтение именованного аргумента без Getopts и Getopt
Создайте файл Bash со следующим сценарием, который считывает три именованных аргумента с помощью цикла «пока». Согласно сценарию, для передачи именованных аргументов в сценарий можно использовать как короткие, так и длинные параметры. Опции -u или –user, -p или –pass и -h или –host используются для передачи трех именованных значений аргументов во время выполнения скрипта. Затем значения аргументов считываются и сохраняются в трех переменных с помощью цикла «пока» и команды «сдвиг».
#!/bin/bash #Читать значения аргументов while [[ "$#" -gt 0 ]] do case $1 in -u|--user) User="$2"; shift;; -p|--pass) Password="$2"; shift;; -h|--host) Host="$2"; shift;; esac shift done #Вывести значения аргументов printf "username: $User \npassword: $Password \nhostname: $Host\n"
Сценарий выполняется с тремя допустимыми именованными аргументами в следующем выводе. Итак, выводятся значения трех аргументов:
andreyex@andreyex:~$ bash namedarg3.bash -u andreyex --pass hello123 -h localhost username: andreyex password: hello123 hostname: localhost andreyex@andreyex:~$
В этой статье показаны различные способы использования именованных аргументов в сценарии Bash, чтобы помочь пользователям Bash узнать, как использовать именованные аргументы.