Комплетан водич за Bash функције: Оптимизујте своје Shell скрипте

Последње ажурирање: Октобар КСНУМКС КСНУМКС
  • Функције вам омогућавају да енкапсулирате блокове кода како бисте избегли сувишност и побољшали читљивост скрипти.
  • Важно је управљати опсегом променљивих користећи кључну реч local како би се избегли сукоби са глобалним окружењем.
  • Враћање вредности у Bash-у је ограничено на излазно стање (0-255), што захтева употребу echo-а или променљивих за враћање сложених података.
  • Модуларизација помоћу команде source олакшава поновну употребу функција у више системских датотека.

Крупни план монитора са Bash скриптом који приказује дефиницију функције са професионалним истицањем синтаксе у модерном развојном окружењу.

Када почнете да пишете Bash скрипте, нормално је да све у почетку изгледа једноставно, али дође тачка када код постане права збрка. Ако сте приметили да копирате и лепите исте делове команди изнова и изнова, време је да пређете на функције. У основи, функција је као мала скрипта унутар друге скрипте која вам омогућава да дате име скупу инструкција како бисте их могли позвати кад год желите.

Не ради се само о уштеди времена куцања, већ о усвајању професионалне праксе. Избегавањем понављања кода, драстично смањујете шансе за грешке и, пре свега, олакшавате одржавање. Ако треба да промените пословно правило или исправите грешку, то треба да урадите само на једном месту уместо да претражујете целу датотеку где сте га још поновили.

Како декларисати функције у Башу

Да бисте извршили функцију, Bash нуди неколико начина, тако да можете користити који год желите. Најчешћи и најпожељнији начин је да напишете име функције праћено заградама. На пример: mi_funcion() { comandos; }Постоји и експлицитнија синтакса која користи резервисану реч функција пре имена, мада се ређе налази у савременим писмима.

Ако сте у журби и желите да све дефинишете у једном реду, можете то учинити, али пазите на размаке! Веома је важно оставити размак. размак после отварајућег кључа и пре завршне наредбе, поред одвајања интерних команди тачком-зарезом. На пример: nombre() { echo "Hola"; echo "Mundo"; }Ако заборавите ове детаље, Bash ће се жалити и скрипта се неће покренути.

Кључна ствар коју не смете превидети јесте да декларисање функције не значи да ће се она аутоматски извршити. Да би код унутар витичастих заграда оживео, морате позвати функцију по имену у телу скрипте. Такође, увек имајте на уму да дефинишете функцију пре него што покушате да је користите ; ако је позовете пре декларисања, шел неће знати о чему говорите и избациће грешку.

Игра променљивих: Глобални и локални опсег

Овде се многи људи збуне. Подразумевано, у Bash-у, свака променљива коју креирате је глобална . То значи да ако дефинишете променљиву унутар функције, она ће наставити да постоји и задржати своју вредност ван те функције, што потенцијално може утицати на друге делове програма. Ово може бити корисно, али у великим скриптама, често је рецепт за катастрофу.

Да бисте избегли ова изненађења, постоји кључна реч `local` . Декларисањем променљиве као `local` унутар функције, осигуравате да је она видљива и модификована само унутар тог блока кода. Ако имате глобалну променљиву и локалну променљиву са истим именом, локална променљива ће имати предност док је унутар функције, али када се функција заврши, глобална променљива ће се вратити на своју првобитну, непромењену вредност.

Преношење аргумената функцијама

Функције не морају бити статичне; оне могу примати податке за обраду различитих информација сваки пут када се позову. Да бисте проследили аргументе, једноставно их напишите после имена функције, одвојене размацима. Унутар функције, приступићете им користећи позиционе променљиве као $1, $2, Итд

Важно је разликовати да су ове променљиве независне од аргумената које прима главни скрипт. Док $0 увек се односи на назив скрипте, променљиве из $1 горе $9 Унутар функције, ово се односи конкретно на параметре који се прослеђују тој функцији. Поред тога, имамо корисне алате као што су $# да сазнате колико је аргумената примљено или $@ да се позовете на комплетну листу параметара.

Дилема враћања вредности

За разлику од језика као што су Пајтон или Јава, Баш функције не враћају вредности у традиционалном смислу. Шта враћа исказ return је излазни статус, цео број између 0 и 255. По конвенцији, 0 означава да је све прошло глатко (успех), а било који други број представља код грешке.

Ако вам је потребно да преузмете резултат прорачуна или неки текст, имате две главне опције. Прва је да користите глобалну променљиву за чување резултата, иако ово није најчистији приступ. Елегантнија опција је да користите стандардни излаз користећи команду echo o printf и снимите тај резултат споља користећи замену команди: resultado=$(mi_funcion)На овај начин, вредност коју исписује функција се директно чува у променљивој.

Напредна поновна употреба и рекурзија

Један од драгуља Bash-а је могућност организовања функција у одвојене датотеке. Ако имате скуп алата које користите у многим скриптама, можете их сачувати у датотеци (на пример, utils.shи учитајте их у било коју другу скрипту помоћу команде извор (или поента) .Ово претвара ваше функције у команде доступне у тренутном процесу, оптимизујући време развоја.

За оне авантуристичније, постоје рекурзивне функције , које позивају саме себе. Идеалне су за решавање проблема који се могу поделити на идентичне подзадатке, као што је израчунавање факторијела. Кључно је овде увек дефинисати основни случај ; у супротном, функција ће позивати саму себе бесконачно док систем не потроши ресурсе и скрипта се не сруши.

Савладавање употребе функција вам омогућава да трансформишете линеарне и заморне скрипте у модуларне алате који се лако читају и одржавају. Од исправне декларације и интелигентног управљања променљивим опсегом, до употребе рекурзије и увоза екстерних библиотека путем изворног кода, ове могућности чине Bash shell изузетно моћним окружењем за аутоматизацију за сваког систем администратора или програмера.