Těchto 8 užitečných vzorů Bash se skrývá v reálných projektech—takto je použít
Shell skriptování je plné tajemství a skrytých triků, takže se vyplatí mít několik vzorů v rukávu. Pro inspiraci vyzkoušejte tyto skripty z reálných projektů, včetně Homebrew, BashBlog a nvm. Učením se z těchto příkladů můžete zlepšit své vlastní shell skripty a zvládnout nové techniky.
Najděte výchozí umístění konfigurace
Aby byly vaše konfigurační soubory přehledné
Když chcete určit konfigurační adresář pro svůj projekt, použijte tento vzor:
"${XDG_CONFIG_HOME:-$HOME/.config}/myproject/config"
Tato hodnota se rozšíří na adresář, který váš projekt může použít k ukládání konfiguračních souborů pro jednotlivé uživatele.
Velmi běžný vzorec, který využívá rozšíření parametrů shellu, jednoho z mnoha typů rozšíření, které Bash podporuje. Používá také specifikaci XDG Base Directory, která pomáhá udržet strukturu vašich adresářů čistou a standardní.
Syntaxe :- zajišťuje, že tato část hodnoty je buď $XDG_CONFIG_HOME — pokud je nastavena a není prázdná — nebo jinak $HOME/.config. Specifikace XDG doporučuje použít $HOME/.config jako výchozí, pokud XDG_CONFIG_HOME není k dispozici; tento vzor toto respektuje.
Todo.txt, shell skript, který spravuje soubor seznamu úkolů, používá tento vzor k definování jednoho z míst, kde hledá svůj konfigurační soubor.
Najděte spustitelný program
Zajistěte, aby byly závislosti vašeho skriptu řádně splněny
Chcete-li najít binární soubor ze sady možných alternativ, použijte vzor jako tento:
[[ -f Markdown.pl ]] && markdown_bin=./Markdown.pl \
|| markdown_bin=$(which Markdown.pl 2>/dev/null \
|| which markdown 2>/dev/null)
Tento vzor používá booleovskou logiku, krátké spojování a testovací operátory k ověření podmínky (existence souboru Markdown.pl) pro nastavení proměnné buď pomocí výchozího souboru, nebo alternativy. Alternativa používá příkaz which k nalezení jedné ze dvou možných záloh v cestě aktuálního uživatele.
Výsledná proměnná, markdown_bin, bude obsahovat buď cestu k příslušnému spustitelnému souboru, nebo prázdný řetězec (což můžete testovat pomocí -n). BashBlog, jednoduchý blogovací systém napsaný v jednom bash skriptu, používá tento vzor k poskytnutí volitelné podpory pro Markdown pomocí standardního programu.
Vygenerovat náhodný název souboru
Když potřebujete zapisovat do nového souboru, ale nezáleží vám na jeho názvu, vyzkoušejte tento vzor:
while [[ -f $out ]]; do out=${out%.html}.$RANDOM.html; done
Tento while cyklus opět používá operátor -f a zároveň využívá speciální proměnnou RANDOM. Chytré je zajistit, aby soubor již neexistoval, i když je to hrubá síla: jednoduše generujte náhodná jména souborů, dokud některé z nich již neexistuje.
$RANDOM není nejlepší přístup, pokud potřebujete skutečně náhodná čísla, ale pro tento typ použití to stačí. V tomto konkrétním případě bude konečný název souboru něco jako mypost.6592.html, mypost.26005.html a tak dále.
BashBlog využívá tento běžný vzor k odeslání generovaného výstupu do dočasného souboru.
Vyžadovat proměnnou
Obranné programování je dobrá praxe
Aby bylo zajištěno, že je proměnná definována předtím, než se cokoliv jiného provede, použijte tento vzor:
do_stuff() {
[[ -z $global_variable ]] && return
}
Kombinace -z pro testování prázdného řetězce a krátkého spojení && pro předčasné ukončení je velmi flexibilní a použitelná v široké škále situací. V tomto konkrétním případě se používá k ověření globální proměnné a předčasnému ukončení funkce. To je dobrá praxe, pokud máte funkci, která závisí na nějaké hodnotě a nemůže podniknout žádnou rozumnou akci kromě toho, že selže elegantně.
Můžete také zkontrolovat existenci pozičních parametrů a učinit je povinnými, pokud v případě selhání odejdete dříve:
[[ -z $1 ]] && return
Opět, BashBlog tento vzor hojně využívá. Homebrew ho také používá v tomto brew skriptu, který kontroluje běžné proměnné jako BASH_VERSION, PWD a HOME.
Přiřaďte parametry k lokálním proměnným
Pro každého, kdo musí udržovat váš kód, včetně vás
Používání jasných a rozumných názvů pro vaše proměnné činí váš kód snáze čitelným a méně rizikovým při úpravách. Zde je příklad vzoru, který může enormně pomoci:
foo() {
username=$1
name=$2
...
}
Na rozdíl od většiny programovacích jazyků Bash skriptování nepodporuje pojmenované parametry, ani pro programy, ani pro funkce. Místo nich jsou k dispozici poziční parametry, jako $1 pro odkaz na první, $2 pro druhý a tak dále. Ale uvnitř skriptu nebo funkce, zejména těch delších, se $1 a $2 brzy stávají nepohodlnými pro práci.
Tento vzor funguje tím, že řeší tento problém a při první příležitosti přiřazuje poziční parametry k lokálním proměnným s čitelnými názvy.
Přiřazení parametrů znovu také pomáhá předejít problémům, když jsou zpracovávány v cyklu nebo měněny pomocí vestavěného příkazu set. Pokud vaše funkce přijme uživatelské jméno v $1, jeho znovupřiřazení zajistí, že bude později dostupné, bez ohledu na to, co se s $1 stane. Také to pomáhá v případě, že byste někdy potřebovali přeskupit parametry vaší funkce; v takovém případě stačí změnit počáteční přiřazení přímo na začátku funkce, nikoli každé použití $1 uvnitř ní.
Skript nvm používá tento vzor a je hojně používán v mnoha shell skriptech.
Přesměrujte výstup z několika příkazů do souboru
Tento vzor může odstranit spoustu nadbytečnosti
Pravděpodobně už víte, jak přesměrovat jako profesionál, ale stále to může být nepohodlné, zejména při více příkazech. Naštěstí existuje zkratka a tento vzor ji plně využívá:
{
command1
command2
} > filename
Tento vzor spustí nejprve command1, potom command2, přesměrujíc výstup každého z nich do souboru s názvem filename. Čím více příkazů potřebujete spustit, tím více získáte tím, že nemusíte opakovat název souboru a přesměrovací operátor při každém příkazu, a je mnohem snazší použít jiný název souboru, pokud je potřeba.
Je důležité poznamenat, že existuje velmi podobná syntaxe seskupování, která používá závorky místo složených závorek:
(
command1
command2
) > filename
Rozdíl je v tom, že tyto příkazy nyní běží v podshellu, což znamená—například—že jakákoli přiřazení proměnných nejsou dostupná mimo tuto skupinu.
Existují další nuanace syntaxe, ale pokud použijete tento víceradkový formát, neměli byste na ně narazit.
Zpracovat soubor řádek po řádku
Věci dělej krok za krokem
Tento vzor vám pomůže zpracovávat konfigurační soubory, texty v Markdownu a jiné typy textových souborů. Je nejvíce užitečný, když je každý řádek souboru převážně nezávislý na ostatních:
while IFS='' read -r line; do
...
command $line
...
done < $filename
Tady se toho děje hodně, takže to vysvětlím postupně. Vestavěná funkce read načítá data ze stdin a ukládá je do proměnné—in this case do proměnné line. Vrací false, když není co číst, takže v kombinaci s přesměrováním vstupu z pojmenovaného souboru bude smyčka pokračovat, dokud nebude veškerý vstup spotřebován. Proměnná IFS (interní oddělovač polí) v tomto případě ovlivňuje, jak read zachází s počátečními/konečnými mezerami, a zajišťuje, že jsou zachovány.
Použijte heredocy k zápisu do souboru
Tato konkrétní syntaxe vypadá mnohem přehledněji
Syntaxe heredoc je taková, kterou budete mít důvod používat znovu a znovu, jakmile si ji osvojíte. Ale je ještě výkonnější, než si možná uvědomujete, jak ukazuje tento vzor:
bar() {
cat <<- EOF > "$filename"
Enter lines
of text here
EOF
}
Here dokumenty vám umožňují směrovat více řádků vstupu, aniž byste museli používat nepohodlné únikové znaky nebo opakovat složitou syntaxi. Ten v tomto vzoru je však ještě zvláštnější, s dvěma zajímavými vlastnostmi.
Nejprve používá syntaxi s pomlčkou za dvojitými znaky menší než k odstranění úvodních tabulátorů z každého řádku mezi ohraničujícími znaky. To vám umožní zarovnat vše tak, aby to vypadalo pěkně, což je zvláštní otázka uvnitř funkce—nebo jakéhokoli jiného bloku.
Za druhé, používá příkaz cat s přesměrováním výstupu k odeslání obsahu heredocu do souboru. To usnadňuje naplnění souboru ze skriptu, ať už se jedná o README, konfigurační soubor nebo něco jiného.
Pokud chcete uvnitř here doc používat rozšíření proměnných, ujistěte se, že oddělovač v první řádce není uveden v uvozovkách.
Stůj na ramenou obrů
Zkuste pro inspiraci a naučení se nových technik prozkoumat populární shellové projekty na GitHubu. Pokud narazíte na určitou syntaxi nebo příkaz, kterému nerozumíte, vyhledejte si ho, abyste pochopili, proč se používá tak, jak se používá. Učte se od dalších shellových programátorů a vaše skriptování se bude postupně zlepšovat.




