Rozhodl jsem se že napíši stručný úvod do skriptovacího jazyka Bash. Plánuji z něj hlavně čerpat já, neboť mě značně bzrdí při práci neustále skákat mezi prohlížečem, kde pořád do kola googlím ty stejné příkazy a Vimem.
Většina internetových zdrojů co se týče jazyka podání je výhradně anglicky, je to asi lepší než aby to bylo čínsky, ale já jsem se rozhodl ty to poznámky psát výhradně česky.
Bash si na typy proměných moc nepotrpí. Představte si že ke všemu vnitřně přistupuje jako kdyby to byl string, tedy řetězec (pole) znaků a je mu jedno, zda jste zrovna měli na mysli číslo (int, nedej bože double), pole, nebo textový soubor. #TODO
Kód.
Podmíněné příkazy jsou základním nástrojem pro větvení běhu programu.
Pokud že exit code výrazu v podmínce nabývá hodnoty 0 (tedy
true), tak se pokračuje k vykonání then části
kódu. Jestliže však výraz nabývá 1 a jiné hotnoty (false),
tak považován za nepravdivý a pokračuje se dál bez vykonání podmíněné
části programu.
if <podmínky>; then
<příkazy pro splněný if>
elif <jiná podmínka>; then
<příkazy pro splněný elif>
else
<příkaz který se vykoná vždy když není splněna žádná z předchozích podmínek>
fiČásti elif a else a jejich větvě nejsou nutné, zbylá klíčová slova však v kódu být musí. Blok tedy musí být uzavřen slovem fi (if po zpátku)!
#TODO Někdy se může stát že nám nebude stačit pouze podmínění jedním příkazem.
Může se stát
case $proměná in
"text") <příkazy k vykonání> ;;
"první" | "druhá")
# umožnuje vybíraz z více várazů spojených pomocí nebo *or, |*
<dlouhý blok kódu přes více řádků>
;;
*)
# defoultní případ
;;
esacVygenerovaná poslouponosti pomocí: {} - “brace expansion”
{<start>..<stop>} nebo
{<start>..<stop>..<krok>}
Použití:
{1..10}
{0..2..20}
Využitím příkazu seq.
seq <start> <stop>
seq <start> <inkrement> <stop>
Seq je pokročilejší.
Použití cyklu for each:
for <promená> in <výčet>
do
<příkazy>
done
Cyklus “C-style for”:
for (( initializer; condition; step )); do
shell_COMMANDS
done
Příklad použití:
[[ "string1" == "string2" ]] && echo "Equal" || echo "Not equal"
echo $(( a < b ? a : b ))
^^ vytiskne vetsi z a/b.
echo "<string>" Za zmínku stojí přepínače: -
-n, nevloží na konec řádku zalomení - -e,
povolí interpretaci escape sekvencí (, barev…)
Formatovaný výstup pomocí příkazu printf umožnujě tisknout na výstup
se standardním formátováním. * %s - tisk stringů *
%<minlen>.<maxlen>s * %d - tisk
celých čísel
Použití:
printf "%.25s...\n" "dataURI: DFASDFKAJELKJDFSADFMLAKFJLSKDJFAJSDFL"
echo "${yourvar:0:25}..."Standarní přípony pro konfigurační soubory jsou: - .cfg,
- .conf.
Soubor config.conf:
myvar=Hello WorldSoubor config.conf.defaults:
myvar=Default Value
othervar=Another VariableVýhoda rozdělení konfiguračních souborů na dva je, že v případě že se
nějaká hodnota změní, tak jí není nutné přepsat v původním souboru a
ztratit tak východzí hodnotu, ale pouze se změní v
config.conf.
Pro načítání těchto hodnot lze použít script: -
lib/config.shlib
function config.get() { # ( config_file atribute defoutl_value )Uspání procesu na určitý čas umožnuje příkaz
sleep <sec>, očekává argument počet vteřin, na jak
dlouho se má uspat. Zvládne vyhodnotit i desetiny sekund
sleep 0.1 nebo sleep 1.0e-1.
Pro mnohem menší časové intervaly lze použít příkaz
usleep <us>, který uspí proces na požadovaný počet
microsekund.
Použití:
usleep 1000 uspí proces na 1ms.
Umožnuje vybrat defaultní textový editor v systému (Vi, Vim, Nano,…),
spouští příkaz: $ select-editor.
Cron je terminálová aplikace umožnující časování jednotlivých scriptů, co kdy a jak se má provést. Umožnuje výběr přesné minuty, hodiny, dny v měsíci, měsíce v roce, případně i dne v týdnu a příkazuči sekvence příkazů, které se v ten okamžik mají provést. Intuitivná záhlaví pro Cron zde.
Rootův cron má tu výhodu, že se implicitně spuští s rootovským oprávněním:
$ sudo crontab -e
Uživatelův cron:
$ crontab -e
Přepínače: * -e edit * -l lis
Spuštění příkazu ihned po spuštění systému:
# run script after reboot
`@reboot yourScriptPath`Další specifické časy:
@reboot, @yearly or @annually, @monthly, @weekly, @daily, @hourly, @midnight