GNU/Linux >> Znalost Linux >  >> Linux

Jak napsat smyčku v Bash

Častým důvodem, proč se lidé chtějí naučit unixový shell, je odemknout sílu dávkového zpracování. Pokud chcete provést nějakou sadu akcí s mnoha soubory, jedním ze způsobů, jak toho dosáhnout, je vytvoření příkazu, který tyto soubory iteruje. V programátorské terminologii se tomu říká řízení spouštění, a jedním z nejběžnějších příkladů je pro smyčka.

A pro loop je recept s podrobnostmi o tom, jaké akce má váš počítač pro provádět každý datový objekt (jako je soubor), který určíte.

Klasická smyčka for

Linuxový terminál

  • 7 nejlepších emulátorů terminálu pro Linux
  • 10 nástrojů příkazového řádku pro analýzu dat v systému Linux
  • Stáhnout nyní:SSH cheat sheet
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Výukové programy příkazového řádku systému Linux

Snadná smyčka, kterou lze vyzkoušet, je smyčka, která analyzuje kolekci souborů. Pravděpodobně to není samo o sobě užitečná smyčka, ale je to bezpečný způsob, jak si dokázat, že dokážete zacházet s každým souborem v adresáři samostatně. Nejprve vytvořte jednoduché testovací prostředí vytvořením adresáře a umístěním některých kopií některých souborů do něj. Na začátku bude stačit jakýkoli soubor, ale pozdější příklady vyžadují grafické soubory (jako JPEG, PNG nebo podobné). Složku můžete vytvořit a zkopírovat do ní soubory pomocí správce souborů nebo v terminálu:

Příklad $ mkdir
        $ cp ~/Pictures/vacation/*.{png,jpg} příklad

Změňte adresář na svou novou složku a poté vypište soubory v něm, abyste se ujistili, že vaše testovací prostředí je takové, jaké očekáváte:

$ cd příklad
$ ls -1
kat.jpg
design_maori.png
otago.jpg
vodopád.png

Syntaxe pro procházení každého souboru jednotlivě ve smyčce je:vytvořit proměnnou (f například pro soubor). Poté definujte datovou sadu, kterou má proměnná procházet. V tomto případě procházejte všechny soubory v aktuálním adresáři pomocí * zástupný znak (* zástupný znak odpovídá všemu ). Poté ukončete tuto úvodní větu středníkem (; ).

$ for f in * ; 

V závislosti na vašich preferencích můžete stisknout Návrat tady. Shell se nepokusí provést smyčku, dokud nebude syntakticky dokončena.

Dále definujte, co se má stát s každou iterací smyčky. Pro zjednodušení použijte soubor příkaz k získání malého množství dat o každém souboru, který představuje f proměnná (ale předřazená znakem $ říct shellu, aby vyměnil hodnotu proměnné za cokoliv, co proměnná aktuálně obsahuje):

do file $f ; 

Ukončete klauzuli dalším středníkem a uzavřete smyčku:

done 

Stiskněte Návrat pro spuštění shellu procházet všem v aktuálním adresáři. pro loop přiřadí každý soubor, jeden po druhém, do proměnné f a spustí váš příkaz:

$ pro f v *; do
       > soubor $f;
       > hotovo
        cat.jpg:obrazová data JPEG, standard EXIF ​​2.2
        design_maori.png:obrazová data PNG, 4608 x 2592, 8 bitů /color RGB, neprokládaný
        otago.jpg:obrazová data JPEG, standard EXIF ​​2.2
        waterfall.png:obrazová data PNG, 4608 x 2592, 8bitové/barevné RGB, neprokládané

Můžete to také napsat takto:

$ pro f v *; do souboru $f; hotovo
        cat.jpg:obrazová data JPEG, EXIF ​​standard 2.2
        design_maori.png:obrazová data PNG, 4608 x 2592, 8bitové/barevné RGB, neprokládané
        otago.jpg:Obrazová data JPEG, standard EXIF ​​2.2
        waterfall.png:obrazová data PNG, 4608 x 2592, 8bitové/barevné RGB, neprokládané

Víceřádkový i jednořádkový formát jsou pro váš shell stejné a poskytují přesně stejné výsledky.

Praktický příklad

Zde je praktický příklad toho, jak může být smyčka užitečná pro každodenní práci s počítačem. Předpokládejme, že máte sbírku fotografií z dovolené, které chcete poslat přátelům. Vaše soubory fotografií jsou obrovské, takže jsou příliš velké pro odeslání e-mailem a nepohodlné je nahrát do vaší služby pro sdílení fotografií. Chcete vytvořit menší webové verze svých fotografií, ale máte 100 fotografií a nechcete trávit čas zmenšováním každé fotografie, jednu po druhé.

Nejprve nainstalujte ImageMagick pomocí správce balíčků v systému Linux, BSD nebo Mac. Například na Fedoře a RHEL:

$ sudo dnf install ImageMagick 

Na Ubuntu nebo Debianu:

$ sudo apt install ImageMagick 

Na BSD použijte porty nebo pkgsrc. Na Macu použijte Homebrew nebo MacPorts.

Jakmile nainstalujete ImageMagick, máte k dispozici sadu nových příkazů pro práci s fotografiemi.

Vytvořte cílový adresář pro soubory, které se chystáte vytvořit:

$ mkdir tmp 

Chcete-li zmenšit každou fotografii na 33 % původní velikosti, vyzkoušejte tuto smyčku:

$ for f in * ; do convert $f -scale 33% tmp/$f ; done 

Pak se podívejte do tmp složky, abyste viděli své zmenšené fotografie.

V rámci smyčky můžete použít libovolný počet příkazů, takže pokud potřebujete provést složité akce s dávkou souborů, můžete celý pracovní postup umístit mezi dělat a hotovo prohlášení o pro smyčka. Předpokládejme například, že chcete zkopírovat každou zpracovanou fotografii přímo do sdíleného adresáře fotografií na vašem webovém hostiteli a odstranit soubor fotografie z místního systému:

$ pro f v *; provést 
    převést $f -scale 33 % tmp/$f
    scp -i seth_web tmp/$f [email protected]:~/public_html
    trash tmp/$f;
  hotovo

Pro každý soubor zpracovaný pro smyčka, váš počítač automaticky spustí tři příkazy. To znamená, že pokud tímto způsobem zpracujete pouze 10 fotografií, ušetříte si 30 příkazů a pravděpodobně alespoň tolik minut.

Omezení smyčky

Smyčka se nemusí vždy dívat na každý soubor. Možná budete chtít zpracovat pouze soubory JPEG ve vašem vzorovém adresáři:

$ pro f v *.jpg; převést $f -scale 33 % tmp/$f; hotovo
$ ls -m tmp
kat.jpg, otago.jpg

Nebo místo zpracování souborů možná budete muset akci opakovat určitý počet opakování. A pro proměnná smyčky je definována jakýmikoli daty, která jí poskytnete, takže můžete vytvořit smyčku, která bude iterovat čísla namísto souborů:

$ pro n v {0..4}; dělat echo $n; hotovo
0
1
2
3
4

Více opakování

Nyní víte dost na to, abyste si vytvořili vlastní smyčky. Dokud nebudete spokojeni s opakováním, používejte je na kopie souborů, které chcete zpracovat, a tak často, jak je to možné, používejte příkazy s vestavěnými ochrannými prvky, abyste zabránili ucpání vašich dat a nenapravitelným chybám, jako je nechtěné přejmenování celého adresáře souborů na stejný název, přičemž každý přepíše druhý .

Pro pokročilé pro smyčková témata, čtěte dále.

Ne všechny shelly jsou bash

pro klíčové slovo je zabudováno do prostředí Bash. Mnoho podobných shellů používá stejné klíčové slovo a syntaxi, ale některé shelly, jako tcsh, používají jiné klíčové slovo, jako foreach , místo toho.

V tcsh je syntaxe podobná v duchu, ale přísnější než Bash. V následující ukázce kódu nezadávejte řetězec foreach? na řádcích 2 a 3. Je to sekundární výzva, která vás upozorní, že jste stále v procesu vytváření smyčky.

$ foreach f (*)
foreach? soubor $f
foreach? end
cat.jpg:obrazová data JPEG, standard EXIF ​​2.2
design_maori.png:obrazová data PNG, 4608 x 2592, 8bitové/barevné RGB, neprokládané
otago.jpg:Obrazová data JPEG, standard EXIF ​​2.2
waterfall.png:obrazová data PNG, 4608 x 2592, 8bitové/barevné RGB, neprokládané

V tcsh oba foreach a konec se musí objevit samostatně na samostatných řádcích, takže nemůžete vytvořit pro smyčka na jednom řádku, jak můžete s Bash a podobnými shelly.

Pro smyčky s příkazem find

Teoreticky můžete najít shell, který neposkytuje pro smyčky, nebo můžete raději použít jiný příkaz s přidanými funkcemi.

Najít příkaz je další způsob, jak implementovat funkci for smyčky, protože nabízí několik způsobů, jak definovat rozsah souborů, které chcete zahrnout do smyčky, a také možnosti pro paralelní zpracování.

Najít příkaz je určen k tomu, aby vám pomohl najít soubory na vašich pevných discích. Jeho syntaxe je jednoduchá:zadáte cestu k místu, které chcete vyhledat, a najít najde všechny soubory a adresáře:

$ najít . 
.
./cat.jpg
./design_maori.png
./otago.jpg
./vodopád.png

Výsledky vyhledávání můžete filtrovat přidáním části názvu:

$ najít . -name "*jpg"
./cat.jpg
./otago.jpg

Skvělá věc na hledání spočívá v tom, že každý nalezený soubor může být vložen do smyčky pomocí -exec vlajka. Chcete-li například zmenšit pouze fotografie PNG ve vašem vzorovém adresáři:

$ najít . -name "*png" -exec convert {} -scale 33% tmp/{} \;
$ ls -m tmp
design_maori.png, waterfall.png

V -exec klauzule, závorky {} zastupte cokoli najdete zpracovává (jinými slovy jakýkoli soubor končící na PNG, který byl nalezen, jeden po druhém). -exec klauzule musí být ukončena středníkem, ale Bash se obvykle snaží použít středník pro sebe. Středník „uniknete“ zpětným lomítkem (\; ), abyste našli ví, že má tento středník považovat za ukončovací znak.

Najít příkaz je velmi dobrý v tom, co dělá, a někdy může být až příliš dobrý. Pokud jej například znovu použijete k nalezení souborů PNG pro jiný fotografický proces, zobrazí se několik chyb:

$ najít . -name "*png" -exec convert {} -flip -flop tmp/{} \; 
konvertovat:nelze otevřít obrázek `tmp/./tmp/design_maori.png':
Žádný takový soubor nebo adresář @ error/blob.c/OpenBlob/2643.
...

Zdá se, že najít našel všechny soubory PNG – nejen ty ve vašem aktuálním adresáři (. ), ale také ty, které jste předtím zpracovali a umístili do svého tmp podadresář. V některých případech můžete chtít najít k prohledání aktuálního adresáře a všech ostatních adresářů v něm (a všech adresářů v těch ). Může to být výkonný nástroj pro rekurzivní zpracování, zejména ve složitých strukturách souborů (jako jsou adresáře hudebních umělců obsahující adresáře alb naplněné hudebními soubory), ale můžete to omezit pomocí -maxdepth možnost.

Chcete-li v aktuálním adresáři najít pouze soubory PNG (kromě podadresářů):

$ find . -maxdepth 1 -name "*png" 

Chcete-li najít a zpracovat soubory v aktuálním adresáři plus další úroveň podadresářů, zvyšte maximální hloubku o 1:

$ find . -maxdepth 2 -name "*png" 

Jeho výchozí nastavení je sestoupit do všech podadresářů.

Smyčka pro zábavu a zisk

Čím více smyček používáte, tím více času a úsilí ušetříte a tím větší úkoly můžete řešit. Jste jen jeden uživatel, ale pomocí dobře promyšlené smyčky můžete přimět svůj počítač, aby odvedl těžkou práci.

S opakováním můžete a měli byste zacházet jako s jakýmkoli jiným příkazem a mít jej po ruce, když potřebujete opakovat jednu nebo dvě akce na několika souborech. Je to však také legitimní brána k serióznímu programování, takže pokud musíte provést složitý úkol s libovolným počtem souborů, udělejte si chvilku času a naplánujte si pracovní postup. Pokud můžete dosáhnout svého cíle na jednom souboru, pak tento opakovatelný proces zabalte do pro smyčka je relativně jednoduchá a jediné potřebné "programování" je pochopení toho, jak proměnné fungují, a dostatečná organizace k oddělení nezpracovaných souborů od zpracovaných. S trochou cviku se můžete posunout z uživatele Linuxu na uživatele Linuxu, který ví, jak napsat smyčku, takže jděte do toho a nechte svůj počítač pracovat za vás!


Linux
  1. Jak používat příkazy historie Bash

  2. Jak ladit Bash skript?

  3. Jak zastavit skript Loop Bash v terminálu?

  1. Jak zjistit Bash>=4.0?

  2. Jak napsat víceřádkový řetězec pomocí Bash s proměnnými?

  3. Jak zapsat celé číslo do binárního souboru pomocí Bash?

  1. Jak komentovat v Bash

  2. Jak napsat Bash skript s příklady

  3. Jak získat stav ukončení smyčky v bash