V tomto tutoriále vysvetlíme dve najužitočnejšie rozšírenia bash používané v skriptoch shell:
- $ () - nahradenie príkazu
- $ {} - substitúcia parametra/rozšírenie premennej
Po rozdelení na tokeny sa v skripte vykoná rozšírenie. Token je postupnosť znakov, ktoré shell považuje za jednu jednotku. Môže to byť slovo alebo operátor.
Spustili sme všetky príklady a skripty uvedené v tomto článku v systéme Debian 10 Buster. Môžete ich však ľahko replikovať na väčšine Linuxových shellov. Na tento tutoriál používame predvolený príkazový riadok Debianu, Terminál. V Debiane k nemu máte prístup pomocou vyhľadávacieho panela Spúšťača aplikácií nasledovne:
Na spustenie aplikácie sa dostanete jednoducho stlačením klávesu Super/Windows na klávesnici.
$ () Náhrada príkazu
Podľa oficiálneho referenčného manuálu GNU Bash:
Nahradenie príkazu umožňuje, aby výstup príkazu nahradil samotný príkaz. Bash vykoná rozšírenie vykonaním príkazu a nahradením nahradenia príkazu štandardným výstupom príkazu, pričom sa odstránia všetky koncové nové riadky. Vložené nové riadky sa neodstránia, ale môžu byť odstránené počas rozdeľovania slov. K nahradeniu príkazu dochádza vtedy, ak je príkaz uzavretý nasledovne:
$(príkaz)alebo
“príkaz“
Nasledujúce príkazy ozveny napríklad nahrádzajú vstup príkazu dátumu:
$zahodil$(dátum)$zahodil'dátum'
Na priradenie hodnoty premennej môžete použiť aj substitúciu príkazov. Dnešný dátum vytlačíme napríklad prostredníctvom premennej DNES takto:
$DNES= $(dátum)$zahodil '$ DNES'
Ďalší nástroj na nahradenie príkazov je v slučkách shell na získanie vstupu. Tu sa pokúsime vytlačiť všetky súbory .txt v našom domovskom priečinku pomocou nahradenia príkazov:
prefv /Domov/k vám/ *.TXTurobiť
zahodil '$ f'
hotový
Použitie substitúcie príkazov v skripte Shell
Vyššie uvedené príklady predstavujú niekoľko spôsobov, ktorými môžete vo svojom skripte shell využiť silu substitúcie príkazov. Tu je ukážka správy o stave, ktorú môžeme vytlačiť pomocou nasledujúceho skriptu shell:
#!/bin/shzahodil ***Správa o stave***
DNES= $(dátum)
zahodil 'Dnes je$ DNES'
UŽÍVATELIA= $(SZO | wc-ten)
zahodil '$ UŽÍVATELIAužívatelia sú momentálne prihlásení '
UPTIME= $(dátum;uptime)
zahodil „Prevádzková doba je$ UPTIME'
V tomto skripte bola trikrát použitá náhrada príkazov; pri tlači dátumu, prihlásených používateľov a dostupnosti. Skript sme uložili nasledovne:
Nastavil ho ako spustiteľný a potom ho spustil pomocou nasledujúceho príkazu:
$chmod+ x status.sh$./statys.sh
Tu je výstup z nášho skriptu status.sh:
Môžete samozrejme vytvoriť zmysluplnejšie skripty podľa príkladov, ktoré sme práve spomenuli.
$ {} Nahradenie/rozšírenie parametra
Parameter v Bash je entita, ktorá sa používa na ukladanie hodnôt. Na parameter je možné odkazovať číslom, menom alebo špeciálnym symbolom. Keď sa na parameter odkazuje číslo, nazýva sa to a pozičný parameter . Keď je na parameter odkazovaný názov, nazýva sa a premenná . Keď je na parameter odkazovaný špeciálnym symbolom, znamená to, že ide o parametre automatického nastavovania so špeciálnym použitím.
Rozšírenie/substitúcia parametra je proces načítania hodnoty z odkazovanej entity/parametra. Je to ako keby ste rozbaľovali premennú, aby ste získali jej hodnotu.
Najjednoduchšia možná syntax rozšírenia parametrov je nasledovná:
Tu je návod, ako môžete použiť rozšírenie parametrov v Bash:
$ {parameter}Najjednoduchšie je napríklad nahradiť parameter jeho hodnotou:
$názov='John Doe'$zahodil $ {name}
Tento príkaz nahradí hodnotu názvu premennej, ktorú má použiť príkaz echo:
Môžete si myslieť, že to isté možno dosiahnuť vyhnutím sa zložených zátvoriek nasledovne:
Odpoveď je, že počas rozširovania parametrov tieto zložené zátvorky pomáhajú pri vymedzovaní názvu premennej. Vysvetlíme, čo tu myslíme obmedzením. Spustím nasledujúci príkaz v mojom systéme:
$zahodil „Meno tej osoby je$ name_'Výsledok nevytlačil hodnotu názvu premennej, pretože systém si myslel, že mám na mysli premennú name_. Môj názov premennej teda nebol oddelený. Kučeravé zátvorky v nasledujúcom príklade ohraničia názov premennej a vrátia výsledky nasledovne:
$zahodil „Meno tej osoby je$ {name}_ 'Tu sú všetky spôsoby, akými sú v Shell nahradzované premenné:
$ {variable} | Tento príkaz nahradí hodnotu premennej. |
$ {variable: -word} | Ak je premenná nulová alebo nie je nastavená, premennú nahradí slovo. Hodnota premennej sa nemení. |
$ {premenná: = slovo} | Ak je premenná nulová alebo nie je nastavená, hodnota premennej je nastavená na slovo. |
$ {variable:? message} | Ak je premenná nulová alebo ak nie je nastavená, správa sa vytlačí so štandardnou chybou bash. |
$ {premenná:+slovo} | Ak premenná je nastavený, slovo je nahradený premennou. Samotná hodnota premennej sa však nemení. |
Vyššie uvedené príklady predstavujú niekoľko spôsobov, ktorými môžete v Bash využiť silu variabilnej substitúcie. Tieto spôsoby môžete použiť tak, že použijete expanziu do svojich skriptov shellu, aby ste optimálne splnili svoju úlohu.