Баш опции и разширения на опции

Предаване и разбор на параметри в скриптове

съвети

Серия съдържание:

Това съдържание е част 1 от поредица от статии: Полезни съвети за Linux

Това съдържание е част 1 от 2 от поредицата: Съвети за Linux

Следете за още статии от тази поредица.

Преминаващи параметри

Едно от предимствата на функциите и скриптовете на черупката е възможността за промяна на поведението на една функция или скрипт чрез предаване на параметри на тази функция или скрипт. Изучавайки този раздел, ще научите как да разпознавате и използвате предадените параметри.

В рамките на функция или скрипт можете да предавате параметри, като използвате специалните променливи bash от Таблица 1. Предшествате ги с символа $, за да ги препращате като други променливи на черупката.

Сега можете да дефинирате проста функция, за да разберете колко параметри съдържа и да ги покажете, както е показано в Листинг 1.

Списък 1. Функционални параметри

Shell скриптовете обработват параметрите по същия начин като функциите. Всъщност, често ще откриете, че създавате скриптове за много малки задачи. Листинг 2 показва скрипт на обвивката, testfunc.sh, за същата проста задача и изхода от един от горните входове. Не забравяйте да направите вашия скрипт изпълним с chmod + x .

Листинг 2. Параметри на скрипта на черупката

От таблица 1 научихте, че обвивката може да се позовава на списък на предадени параметри от тип $ * или $ @ и че тези изрази са цитирани или не, зависи от това как се интерпретират. Независимо дали използвате $ *, "$ *", $ @ или "$ @", няма да видите голяма разлика в изхода на горната функция, но бъдете сигурни, че в по-сложна версия разликите ще бъдат значителни, защото искате да анализирате параметрите или, може би да предадете някои от тях на друга функция или скрипт. Листинг 3 показва функция, която отпечатва броя на параметрите и след това параметрите, съответстващи на тези четири опции. Листинг 4 показва функцията в действие. По подразбиране се използва интервал като първи символ за променливата IFS, така че в листинг 4 се добавя вертикална лента като първи знак за променливата IFS, за да се покаже по-ясно къде този символ се използва за разширяване на "$ *".

Листинг 3. Функция за изследване на разликите в обработката на параметри
Листинг 4. Показване на информация за параметрите с помощта на testfunc2

Разгледайте внимателно разликите, особено вида на използваните кавички и опциите, които съдържат интервали - интервали или нови редове. Имайте предвид, че като се започне с една двойка символи [], разширението "$ *" всъщност е една дума.

Опции и getopts

Традиционните команди на UNIX и Linux приемат, че някои от предадените аргументи са опции. В исторически план това бяха превключватели под формата на единични знаци, отличаващи се от останалите параметри чрез тирето или знака минус пред тях. За удобство могат да се комбинират някои опции, както в командата ls -lrt, която дава подробен (опция -l, от английски long) списък на съдържанието на директория в обратен ред (опция -r, от английски обратен), сортиран по време на модификация (опция -t, от английско време).

Можете да използвате същите методи в скриптове на черупки, а вградената команда getopts улеснява вашата задача. За да видите как работи, помислете за примерния скрипт, testopt.sh, показан в листинг 5.

Листинг 5. Скриптът testopt.sht

Командата getopts използва две предварително дефинирани променливи. Първоначално променливата OPTIND е настроена на 1. След това съдържа индекса на следващия параметър, който трябва да бъде обработен. Командата getopts връща true, ако е намерена опция, така че обичайната парадигма за обработка на опции използва цикъл while с оператор case в този пример. Първият аргумент, предаден на getopts, е списък с букви за опции, които ще бъдат разпознати, в този случай p и r. Двоеточие (:) след буквата за опция показва, че опцията изисква стойност; например опцията -f може да се използва за указване на име на файл, както в командата tar. В този пример първото двоеточие инструктира командата getopts да мълчи и да не показва нормални съобщения за грешка, тъй като този скрипт ще осигури собствена обработка на грешки.

Вторият параметър, optname в този пример, е името на променливата, която ще получи името на намерената опция. Ако се очаква дадена опция да има стойност, тази стойност, ако има такава, ще бъде поставена в променливата OPTARG. В безшумен режим грешката може да възникне в следните два случая.

  1. Ако бъде открита неразпозната опция, optname ще съдържа? и OPTARG ще съдържа тази неизвестна опция.
  2. Ако се намери опция, която изисква стойност, но няма стойност, optname ще съдържа: и OPTARG ще съдържа името на опцията, чийто аргумент липсва.

В режим на пълен дисплей тези грешки генерират съобщения за диагностична грешка и OPTARG се отменя. Може ли скриптът да използва стойности? или: в optname, за да открие и евентуално да се справи с грешката.

Листинг 6 показва два примера за този прост скрипт.

Листинг 6. Изпълнение на скрипта testopt.sh

Ако е необходимо, можете да предадете набор от аргументи на командата getopts за обработка. Ще трябва да настроите OPTIND обратно на 1, ако извикате getopts за нов набор от аргументи в същия скрипт, в който сте го използвали с други аргументи. За повече подробности вижте страниците с информация или информация за bash.

Разширения на параметри

Така че сте видели как параметрите се предават на функция или скрипт и как да разпознавате опциите. Сега нека започнем да обработваме опции и параметри. Би било хубаво да знаете какво оставят аргументите, след като опциите бъдат обработени. Тогава може да се наложи да потвърдите стойностите на параметрите или да зададете стойност по подразбиране за липсващите параметри. Този раздел представя някои от стойностите на параметрите, които са налични в bash. Разбира се, имате и мощни команди на Linux или UNIX като sed или awk за по-сложни задачи, но трябва да знаете и как се използват разширенията на черупката.

Нека започнем нашия скрипт, като анализираме опциите и параметрите на функциите, които видяхте по-рано. Нашият скрипт testargs.sh е показан в Листинг 7.

Листинг 7. Скриптът testargs.sh

Опитайте се да стартирате този скрипт няколко пъти, за да видите как работи, след което ще го разгледаме по-подробно. Листинг 8 показва някои примери за резултата.

Листинг 8. Изпълнение на скрипта testargs.sh

Имайте предвид, че аргументите са отделни от опциите. Функцията showopts анализира опциите както преди, но използва израз за връщане, за да върне стойността на променливата OPTIND към извикващия израз. Процесът на извикване присвоява тази стойност на променливата argstart. След това тази стойност се използва за избор на подмножество от първоначалните параметри, състоящо се от онези параметри, които не са били обработени като опции. Това се прави с помощта на разширението
$
Не забравяйте да приложите този израз в кавички, за да запазите параметрите заедно с придружаващите ги интервали, както видяхте по-рано в Листинг 2.

Ако не сте запознати със скриптове и функции, обърнете внимание на следните точки:

  1. Изразът return връща изходната стойност на showopts, която е достъпна от мястото, където е била извикана с помощта на $?. Можете също да използвате връщаната стойност на функцията с команди като test или while, за да контролирате разклоняването и контурите.
  2. Bash функциите могат да съдържат незадължителната дума "функция", например:
    функция showopts ()
    Използването на тази дума не е част от стандарта POSIX и не се поддържа от черупки като тире, така че ако я използвате, не я посочвайте като линия на шебанг
    #!/bin/sh
    тъй като това може да накара вашата системна обвивка да не работи както очаквате.
  3. Изходът на функцията, като изходът, генериран от ехо операторите в тези две функции, не се отпечатва, но ще бъде достъпен от мястото, където е бил извикан. Ако този изход не е присвоен на променлива или по друг начин се използва като част от извикващия израз, черупката ще се опита да го направи, вместо да показва.

Подмножества и части от низове

Обикновено разширението приема формата: $, където аргументът LENGTH не е задължителен. Така че, ако искате да изберете само определена подгрупа от аргументите на скрипта, можете да използвате пълната версия, за да покажете колко аргументи да изберете. Например $ се отнася до три аргумента, започващи от аргумент 4, а именно аргументи 4, 5 и 6. Можете да използвате това разширение, за да изберете конкретни опции, различни от тези, които са налични веднага, като се използват $ 1 до $ 9 включително. $ - начин за извикване на 15 параметъра наведнъж.

Можете да използвате разширение със специфични параметри, както и целия набор от параметри, представени с $ * или $ @. В този случай параметърът се третира като низ и число, представляващо отместването или дължината. Например, ако променливата x има стойността "някаква стойност", тогава
$
ще има стойността "e val", както е показано в Листинг 9.

Листинг 9. Поднизове на стойността на параметъра в черупката

Вече видяхте, че $ # указва броя на параметрите и че разширението $ се отнася и за двата конкретни параметъра, $ * и $ @, така че не бива да ви изненадва, че подобна конструкция $ може да се използва за определяне на размер на конкретен параметър. Простата функция на тестовата дължина, показана в листинг 10, илюстрира това. Опитайте сами.

Листинг 10. Параметър за дължини

Работа с шаблони

Разширението на параметъра също включва възможности за търсене на заместващи символи, използвайки същите заместващи символи, използвани в разширенията на имена на файлове или заместващи символи. Имайте предвид, че това не съответства на регулярните изрази, използвани от grep .