Почетна » како да » Водич за почетнике за скриптирање љуски 2 за петље

    Водич за почетнике за скриптирање љуски 2 за петље

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

    Датотека датецп Ревиситед

    У првој верзији нашег водича за скриптирање, направили смо скрипту која је копирала датотеку у директоријум резервне копије након што је додао датум на крај имена датотеке.

    Самуел Дионне-Риел је у коментарима истакао да постоји много бољи начин да се обраде наше варијабилне референце.

    Аргументи су одвојени размаком у басх љусци, токенираће када постоји размак у добивеној проширеној команди. У вашем писму, цп $ 1 $ 2. $ дате_форматтед ће радити онако како је замишљено све док проширене варијабле немају мјеста у њима. Ако позовете свој скрипт на овај начин: датецп "моје старо име" "моје ново име" проширење ће резултирати овом командом: цп моје ново име моје старо име који заправо има 6 аргумената.

    Да би исправно решили овај проблем, последња линија скрипте треба да буде: цп "$ 1" "$ 2. $ дате_форматтед"

    Као што можете видети, промена линије наше скрипте са:

    цп -ив $ 1 $ 2. $ дате_форматтед

    до:

    цп -ив “$ 1” “$ 2”. $ дате_форматтед

    ће се побринути за овај проблем када користи скрипту на датотекама које имају размаке у имену. Самуел такође наглашава да приликом копирања и лепљења кода са овог сајта (или интернета уопште) обавезно замените одговарајуће цртице и цитате за „типографски боље“ оне које их често замењују. Такође ћемо радити више како би били сигурни да је наш код више цопи / пасте фриендли. ;-)

    Други коментатор, Милес Браитхваите, одлучио је да прошири наш скрипт тако да би се датум појавио прије екстензије. Дакле, уместо

    тастифиле.мп3.07_14_11-12.34.56

    добили бисмо ово:

    тастифиле.07_14_11-12.34.56.мп3

    што је за већину корисника мало прикладније. Његов код је доступан на његовој ГитХуб страници. Хајде да погледамо шта он користи да раздвоји име фајла.

    дате_форматтед = $ (датум +% И-% м-% д_% Х.% М% С)
    филе_ектенсион = $ (ецхо "$ 1" | авк -Ф. 'принт $ НФ')
    филе_наме = $ (басенаме $ 1. $ филе_ектенсион)

    цп -ив $ 1 $ филе_наме- $ дате_форматтед. $ филе_ектенсион

    Мало сам промијенио форматирање, али можете видјети да Милес објављује своју функцију датума у ​​Лине 1. У Лине 2, међутим, он користи "ецхо" наредбу с првим аргументом скрипте за излазак имена датотеке. Он користи команду цеви да узме тај излаз и користи је као улаз за следећи део. После цеви, Милес позива "авк" команду, која је моћан програм за скенирање узорака. Користећи -Ф ознаку, он команди каже да је следећи знак (после размака) оно што ће дефинисати “сепаратор поља”. У овом случају, то је период.

    Сада, авк види датотеку под називом “тастифиле.мп3” која се састоји од два поља: “тастифиле” и “мп3”. На крају, он користи

    'принт $ НФ'

    да бисте приказали последње поље. У случају да ваша датотека има више периода - тако да авк види више поља - она ​​ће приказати само последњу, која је екстензија датотеке.

    У реду 3, он креира нову променљиву за име фајла и користи команду "басенаме" за референцу свега у $ 1 осим екстензија датотеке. Ово се постиже коришћењем басенаме и даје му $ 1 као аргументу, затим додавањем размака и екстензије фајла. Екстензија фајла се аутоматски додаје због променљиве која упућује на 2. ред

    тастифиле.мп3

    и претворите га у

    тастифиле

    Онда у последњој линији, Милес је саставио команду која ће исписати све у реду. Имајте на уму да не постоји референца на $ 2, други аргумент за скрипту. Ова специфична скрипта ће копирати тај фајл у ваш тренутни директоријум. Сјајан посао Самуел и Милес!

    Покретање скрипти и $ ПАТХ

    У чланку Основе такодје помињемо да скриптама није дозвољено да се подразумевају као команде. То значи да морате да покажете путању скрипте да бисте је покренули:

    ./скрипта

    ~ / бин / сцрипт

    Али, постављањем ваших скрипти у ~ / бин /, можете само да откуцате њихова имена са било ког места да би их покренули.

    Коментатори су провели неко време расправљајући о томе како је ово исправно, јер ниједан модерни Линук дистро не креира тај директоријум по дефаулту. Осим тога, нико га не додаје у $ ПАТХ варијаблу по дефаулту, што је потребно да би се скрипте изводиле као команде. Био сам помало збуњен, јер након провјере моје $ ПАТХ варијабле, коментатори су били у праву, али позивни скрипти су и даље радили за мене. Открио сам зашто: многи модерни Линук дистроси креирају посебну датотеку у корисниковом хоме директоријуму - .профиле.

    Овај фајл се чита од стране басх (осим ако је у кућном директоријуму корисника присутан .басх_профиле), а на дну постоји одељак који додаје ~ / бин / фолдер променљивој $ ПАТХ ако постоји. Дакле, та мистерија је рашчишћена. За остатак серије, наставићу да постављам скрипте у директоријум ~ / бин / јер су корисничке скрипте и требало би да буду у могућности да их покрећу корисници. Чини се да ми заиста не треба да се мешамо са променљивом $ ПАТХ ручно да би ствари функционисале.

    Понављање команди са петљама

    Хајде да дођемо до једног од најкориснијих алата у арсеналу геек за бављење репетитивним задацима: петље. Данас ћемо расправљати о "за" петљама.

    Основни приказ фор-лооп-а је следећи:

    за ВАРИАБЛЕ у ЛИСТУ; урадити
    цомманд1
    цомманд2

    цоммандн
    Готово

    ВАРИЈАБЛЕ може бити било која варијабла, иако се најчешће мала слова “и” користе по договору. ЛИСТ је листа ставки; можете одредити више ставки (раздвајајући их размаком), показивати на спољашњу текстуалну датотеку или користити звјездицу (*) за означавање било које датотеке у тренутном директорију. Наведене команде су увучене по конвенцији, тако да је лакше видети умеће - стављање петљи у петљу (тако да можете да петљате док петљате).

    Пошто листе користе размаке као граничнике - то значи да простор означава прелазак на следећу ставку на листи - датотеке које имају размаке у имену нису веома пријатељске. За сада се држимо рада са датотекама без размака. Почнимо са једноставним скриптом да прикажемо имена датотека у тренутном директоријуму. Направите нови скрипт у ~ / бин / фолдеру под називом “лоопсцрипт”. Ако се не сећате како да то урадите (укључујући и означавање као извршни фајл и додавање хаш-банг хацк-а) погледајте чланак басх скриптирање.

    У њему унесите следећи код:

    за и у тачки 1 тачка 2 тачка 3 тачка 4 тачка 5 тачка 6; урадити
    ецхо "$ и"
    Готово

    Када покренете скрипту, требали бисте те ставке пописа добити само као излаз.

    Прилично једноставно, зар не? Да видимо шта ће се догодити ако мало промијенимо ствари. Промените скрипту тако да каже:

    за и ин *; урадити
    ецхо "$ и"
    Готово

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

    Сада, промијенимо ецхо наредбу у нешто корисније - рецимо, зип наредбу. Наиме, датотеке ћемо додати у архиву. И, хајде да добијемо неке аргументе у миксу!

    за и у $ @; урадити
    зип архива "$ и"
    Готово

    Има нешто ново! “$ @” Је пречица за “$ 1 $ 2 $ 3… $ н”. Другим речима, то је комплетна листа свих аргумената које сте навели. Сада погледајте шта се дешава када покренем скрипту са неколико улазних датотека.

    Можете да видите које су датотеке у мом фолдеру. Наредио сам наредбу са шест аргумената, и свака датотека је додана у зип архиву под називом "арцхиве.зип". Полако, добро?

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


    Употреба фор-лоопс олакшава извођење гомиле акција за све датотеке у директоријуму. Можете слагати широк спектар команди заједно и врло лако користити аргументе за креирање и на-листи, а ово је само врх леденог брега.

    Басх сцриптерс, имате ли неке предлоге? Да ли сте направили користан скрипт који користи петље? Желите да поделите своје мисли о серији? Оставите неке коментаре и помозите другим скриптовима да се појаве!