Domovská » jak » Průvodce pro začínající uživatele Shell Scripting 2 For Loops

    Průvodce pro začínající uživatele Shell Scripting 2 For Loops

    Pokud chcete vytvořit váš geek věřit, připojte se k nám pro druhou splátku v naší shell skriptovací série. Máme několik oprav, několik vylepšení minulého týdne a návod na smyčku pro nezasvěcené.

    Skript datacp byl znovu publikován

    V první spodní části našeho průvodce skriptování skriptů jsme vytvořili skript, který zkopíroval soubor do záložního adresáře po připojení dne do konce názvu souboru.

    Samuel Dionne-Riel zdůraznil v komentářích, že je mnohem lepší způsob, jak zvládnout naše proměnné reference.

    Argumenty jsou ve skříni bash odděleny mezerami, tokenuje, když je ve výsledném rozšířeném příkazu mezera. Ve svém scénáři, cp $ 1 $ 2. $ date_formatted bude pracovat tak, jak je určeno, pokud rozšířené proměnné nemají mezery v nich. Pokud voláte svůj skript tímto způsobem: datecp "můj starý název" "moje nové jméno" rozšíření bude mít za následek tento příkaz: cp můj nový název můj starý name.the_date který má ve skutečnosti 6 argumentů.

    Chcete-li tento problém správně řešit, poslední řádek skriptu by měl být: cp "$ 1" "$ 2. $ date_formatted"

    Jak můžete vidět, změňte řádek našeho skriptu z:

    cp -iv $ 1 $ 2 $ $ date_formatted

    na:

    cp -iv "$ 1" "$ 2". $ date_formatted

    bude se o tento problém postarat při použití skriptu na soubory, které mají mezery v názvu. Samuel také poukazuje na to, že při kopírování a vkládání kódu z tohoto webu (nebo internetu obecně) nezapomeňte nahradit správné pomlčky a citace pro ty "typograficky lepší", které je často nahrazují. Dále budeme dělat více, abychom se ujistili, že náš kód je více kopírovatelný / průhledný. ;-)

    Další komentátor Myles Braithwaite se rozhodl rozšířit náš skript tak, aby se datum objevilo před rozšířením souboru. Takže namísto

    tastyfile.mp3.07_14_11-12.34.56

    dostali bychom toto:

    tastyfile.07_14_11-12.34.56.mp3

    což je pro většinu uživatelů trochu výhodnější. Jeho kód je k dispozici na jeho stránce GitHub. Podívejme se na to, co používá k oddělení názvu souboru.

    date_formatted = $ (datum +% Y-% m-% d_% H.% M% S)
    file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
    název_souboru = $ (název_souboru $ 1. $ file_extension)

    cp -iv $ 1 $ jméno_souboru- $ date_formatted. $ file_extension

    Formát jsem trochu změnil, ale vidíte, že Myles prohlašuje, že je jeho funkce v řádku č. 1. Na řádku 2 však použije příkaz "echo" s prvním argumentem skriptu pro zobrazení názvu souboru. Pomocí příkazu potrubí použije tento výstup a použije jej jako vstup pro další část. Po potrubí zavolá Myles příkaz "awk", což je výkonný skenovací program. Pomocí příznaku -F říká příkazu, že další znak (po mezerě) bude definovat "oddělovač polí". V tomto případě to je období.

    Nyní, awk vidět soubor s názvem "tastyfile.mp3" jako složený ze dvou polí: "tastyfile" a "mp3". Konečně používá

    'tisk $ NF'

    pro zobrazení posledního pole. V případě, že váš soubor má více období - a proto se awk zobrazí více polí - zobrazí pouze poslední, což je přípona souboru.

    V řádku 3 vytvoří novou proměnnou pro název souboru a použije příkaz "basename" k odkazu na vše v $ 1 až na příponu souboru. To se provádí pomocí basename a přidáním argumentu $ 1 a přidáním mezery a příponou. Přípona souboru je automaticky přidána kvůli proměnné, která odkazuje na řádek 2. Co to udělá

    tastyfile.mp3

    a přeměnit ji

    chutný soubor

    Pak v posledním řádku Myles sestavil příkaz, který bude vše v pořádku. Všimněte si, že neexistuje žádný odkaz na $ 2, druhý argument pro skript. Tento konkrétní skript místo toho zkopíruje daný soubor do aktuálního adresáře. Skvělá práce Samuel a Myles!

    Spouštění skriptů a $ PATH

    V článku o základních informacích také uvádíme, že skripty nesmí být ve výchozím nastavení označovány jako příkazy. To znamená, že chcete spustit cestu ke skriptu:

    ./skript

    ~ / bin / skript

    Ale umístěním skriptů do adresáře ~ / bin / byste mohli zadávat jména z libovolného místa, aby je spustili.

    Commenters strávil nějaký čas debatováním o tom, jak je to správné, neboť žádný moderní distribuční systém Linux nenastaví tento adresář ve výchozím nastavení. Navíc, nikdo jej nepřičítá do proměnné $ PATH, což je to, co je zapotřebí pro spouštění skriptů jako příkazů. Byl jsem trochu zmatený, protože po kontrole mé proměnné $ PATH měli koméři pravdu, ale volání skriptů stále pracovalo pro mě. Zjistil jsem, proč: mnoho moderních distribucí Linuxu vytváří speciální soubor v domovském adresáři uživatele - .profile.

    Tento soubor je čten bash (pokud není v domovském adresáři uživatele zobrazen .bash_profile) a v dolní části existuje část, která přidá složku ~ / bin / proměnnou $ PATH, pokud existuje. Takže toto tajemství je jasné. Pro zbytek série budu pokračovat v umístění skriptů v adresáři ~ / bin /, protože jsou uživatelské skripty a uživatelé by měli být schopni je spustit. A zdá se, že bychom neměli skutečně potírat s proměnnou $ PATH ručně, abychom mohli pracovat.

    Opakování příkazů pomocí smyček

    Pojďme se podívat na jeden z nejužitečnějších nástrojů v geek arsenalu pro řešení opakujících se úkolů: smyčky. Dnes budeme diskutovat o smyčkách "pro".

    Základní obrys pro-smyčky je následující:

    pro VARIABLE v SEZNAMU; dělat
    command1
    command2
    ...
    commandn
    Hotovo

    VARIABLE může být libovolná proměnná, i když nejčastěji se používá malá písmena "i". SEZNAM je seznam položek; můžete zadat více položek (oddělit je mezerou), ukázat na externí textový soubor nebo použít hvězdičku (*) pro označení libovolného souboru v aktuálním adresáři. Uvedené příkazy jsou odsazeny konvencí, takže je jednodušší vidět hnízdění - uvedení smyček do smyček (takže můžete smyčku při smyčce).

    Protože seznamy používají mezery jako oddělovače - znamená to, že se jedná o přesun na další položku v seznamu - soubory s mezery v názvu nejsou příliš přátelské. Prozatím pracujeme se soubory bez mezery. Začneme jednoduchým skriptem, abychom zobrazili názvy souborů v aktuálním adresáři. Vytvořte nový skript ve složce ~ / bin / s názvem "loopscript". Pokud si nepamatujete, jak to udělat (včetně jeho označování jako spustitelného souboru a přidání hash bang hack), podívejte se na náš článek bash skriptování základy.

    V něm zadejte následující kód:

    pro i v položce1 položka2 položka3 položka4 položka5 položka6; dělat
    echo "$ i"
    Hotovo

    Když spustíte skript, měli byste tyto položky seznamu získat jako výstup.

    Docela jednoduché, že? Podívejme se, co se stane, když trochu něco změníme. Změňte svůj skript takto:

    pro i v *; dělat
    echo "$ i"
    Hotovo

    Při spuštění tohoto skriptu ve složce byste měli získat seznam souborů, které obsahuje jako výstup.

    Nyní změňte příkaz echo na něco užitečnějšího - řekněme příkazu zip. Namísto toho přidáme soubory do archivu. A vezměme pár argumentů v mixu!

    pro i v $ @; dělat
    zip archiv "$ i"
    Hotovo

    Je tu něco nového! "$ @" Je zkratka pro "$ 1 $ 2 $ 3 ... $ n". Jinými slovy je to úplný seznam všech argumentů, které jste zadali. Nyní sledujte, co se stane, když spustím skript s několika vstupními soubory.

    Můžete vidět, které soubory jsou ve složce. Spustil jsem příkaz se šesti argumenty a každý soubor byl přidán do zip archivu s názvem "archive.zip". Snadné, správně?

    Pro smyčky jsou docela úžasné. Nyní můžete spustit dávkové funkce v seznamech souborů. Například můžete všechny argumenty skriptu zkopírovat do archivu ZIP, přesunout originály do jiné složky a automaticky zajistit kopírování tohoto souboru zip do vzdáleného počítače. Pokud nastavíte soubory klíčů pomocí SSH, nebudete muset zadat heslo ani dokonce ani skriptu smazat, aby po jeho nahrání soubor zip odstranil!


    Použití pro smyčky usnadňuje dělat spoustu akcí pro všechny soubory v adresáři. Můžete sestavit celou řadu příkazů dohromady a pomocí argumentů snadno vytvářet a vytvářet seznamy, a to je jen špička ledovce.

    Bash scriptery, máte nějaké návrhy? Udělali jste užitečný skript, který používá smyčky? Chcete se podělit o své myšlenky na sérii? Nechte některé komentáře a pomozte ostatním nováčkům skriptů!