Как да преминете аргументи към баш-скрипт

Команди, синтаксис и примери

Можете да напишете скрипт bash така, че да получава аргументи, указани при извикване на скрипта от командния ред. Този метод се използва, когато даден скрипт трябва да изпълнява малко по-различна функция в зависимост от стойностите на входните параметри (аргументите).

Например, може да имате скрипт, наречен "stats.sh", който изпълнява определена операция във файл, например броене на думите му. Ако искате да можете да използвате този скрипт на много файлове, най-добре е името на файла да се предаде като аргумент, така че да можете да използвате същия скрипт за всички файлове, които ще се обработват. Например, ако името на файла, който ще бъде обработен, е "songlist", бихте въвели следния команден ред:

sh Статии

Аргументите са достъпни в скрипт, като се използват променливите $ 1, $ 2, $ 3 и т.н., където $ 1 се отнася за първия аргумент, $ 2 за втория аргумент и т.н. Това е илюстрирано в следния пример:

ФАЙЛ1 = $ 1 wc $ FILE1

За четливост задайте променлива с описателно име на стойността на първия аргумент ($ 1), а след това извикайте програмата за бройни думи ( wc ) на тази променлива ($ FILE1).

Ако имате променлив брой аргументи, можете да използвате променливата "$ @", която е масив от всички входни параметри. Това означава, че можете да използвате задвижване за итеративно обработване на всеки от тях, както е илюстрирано в следния пример:

за FILE1 в "$ @" направете wc $ FILE1 направено

Ето един пример за това как да наречете този скрипт с аргументи от командния ред:

sh stats.sh песента song1 songlist2 songlist3

Ако аргументът има интервали, трябва да го прикрепите с единични кавички. Например:

sh stats.sh 'песен 1' 'songlist 2' 'songlist 3'

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

Нека кажем, че имате скрипт, който извлича информация от база данни въз основа на определени параметри като "потребителско име", "дата" и "продукт" и генерира отчет в определен "формат". Сега искате да напишете своя скрипт, така че да можете да предавате тези параметри при извикване на скрипта. Може да изглежда така:

makereport -u jsmith -p преносими компютри -d 10-20-2011 -f pdf

Баш позволява тази функционалност с функцията "getopts". За горния пример можете да използвате getopts както следва:

Това е моментна линия, която използва функцията "getopts" и така нареченото "optstring", в този случай "u: d: p: f:", за да претърсва аргументите. The while-loop преминава през optstring, който съдържа флаговете, които могат да бъдат използвани за предаване на аргументи, и присвоява стойността на аргумента, предоставена за този флаг, на променливата "option". Делото-декларацията след това присвоява стойността на променливата "опция" на глобалната променлива, която може да се използва след като всички аргументи са били прочетени.

Двойните в двойката означават, че стойностите се изискват за съответните знамена. В горния пример всички знамена са последвани от двоеточие: "u: d: p: f:". Това означава, че всички знамена се нуждаят от стойност. Ако например флаговете "d" и "f" не се очаква да имат стойност, optstring ще бъде "u: dp: f".

Една двойка в началото на оптрипъра, например ": u: d: p: f:", има съвсем различно значение. Той ви позволява да боравите с флагове, които не са представени в оптринг. В този случай стойността на променливата "опция" е зададена на "?" и стойността на "OPTARG" е зададена на неочаквания флаг. Позволява ви да изведете подходящо съобщение за грешка, което информира потребителя за грешката.

Аргументите, които не се предхождат от флаг, се игнорират от getopts. Ако флаговете, посочени в оптрипъра, не са предоставени при извикване на скрипта, нищо не се случва, освен ако не се занимавате специално с този случай във вашия код. Всички аргументи, които не се обработват от getops, все още могат да бъдат заснети с обикновените променливи $ 1, $ 2 и т.н.