Полезни съвети за Linux Bash Options и Option Expansions
Предаване и разбор на параметри в скриптове

Серия съдържание:
Това съдържание е част 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 да мълчи и да не показва нормални съобщения за грешка, тъй като този скрипт ще осигури собствена обработка на грешки.