if příkazy!
rozhodnutí, rozhodnutí.
Úvod
Bash, pokud jsou prohlášení velmi užitečná. V této části našeho Bash skriptovacího tutoriálu se dozvíte způsoby, jak můžete použít příkazy if ve vašich Bash skriptech, které pomáhají automatizovat úkoly.
Pokud nám příkazy (a úzce související případová prohlášení) umožňují rozhodovat v našich Bash skriptech. Umožňují nám rozhodnout, zda spustit kus kódu na základě podmínek, které můžeme nastavit., Pokud nám příkazy v kombinaci se smyčkami (na které se podíváme v další části) umožňují vytvářet mnohem složitější skripty, které mohou řešit větší úkoly.
stejně jako to, na co jsme se podívali v předchozích sekcích, jejich syntaxe je velmi specifická, takže zůstaňte na vrcholu všech malých detailů.
Basic if příkazy
základní if prohlášení účinně říká, že pokud je konkrétní test pravdivý, proveďte danou sadu akcí. Pokud to není pravda, neprovádějte tyto akce., Pokud formátem níže:
<příkazy>
fi
Něco mezi a pak fi (je-li obráceně) bude proveden pouze v případě zkoušky (mezi hranaté závorky), je pravda.
podívejme se na jednoduchý příklad:
if_example.sh
- #!/ bin / bash
- # basic if statement
- if
- then
- echo Hey that \ ‚ s a large number.,
- pwd
- fi
- datum
Pojďme si rozebrat to:
- Řádek 4 – podívejme se, pokud první argument příkazového řádku je větší než 100
- Line 6 a 7 – Bude jen utíkat, když test na linky 4 se vrátí pravda. Můžete zde mít tolik příkazů, kolik chcete.
- řádek 6-zpětné lomítko ( \ ) před jediným citátem ( ‚ ) je zapotřebí, protože jediný citát má zvláštní význam pro bash a tento zvláštní význam Nechceme. Zpětné lomítko uniká zvláštnímu významu, aby se z něj znovu stalo normální prostý jediný citát.,
- řádek 8-fi signalizuje konec příkazu if. Všechny příkazy poté budou spuštěny jako obvykle.
- řádek 10 – protože tento příkaz je mimo příkaz if, bude spuštěn bez ohledu na výsledek příkazu if.
- ./if_example.sh 15
- Fri, 5 Feb 9:06:30 2021
- ./if_example.sh 150
- Hej, to je velké číslo.
- / home / ryan / bin
- Pá 5 Únor 9: 06: 30 2021
vždy je dobré vyzkoušet skripty se vstupem, který pokrývá různé možné scénáře.,
Test
hranaté závorky () ve výše uvedeném příkazu if jsou ve skutečnosti odkazem na příkazový test. To znamená, že zde mohou být také použity všechny operátory, které test umožňuje. Podívejte se na stránku man Pro test, abyste viděli všechny možné operátory (existuje poměrně málo), ale některé z běžnějších jsou uvedeny níže.
Operátor | Popis |
---|---|
! Výraz | výraz je falešný. |
-N řetězec | délka řetězce je větší než nula., |
-z STRING | délka řetězce je nulová (tj. je prázdná). |
STRING1 = STRING2 | STRING1 se rovná STRING2 |
STRING1 != STRING2 | je ŘETĚZEC1 = ŘETĚZEC2 |
INTEGER1 -eq INTEGER2 | INTEGER1 je číselně roven INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 je číselně větší než INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 je číselně menší než INTEGER2 |
-d SOUBORU | SOUBOR existuje a je to adresář., |
-soubor e | soubor existuje. |
-soubor r | soubor existuje a oprávnění ke čtení je uděleno. |
-s soubor | soubor existuje a jeho velikost je větší než nula (tj. není prázdný). |
-soubor w | soubor existuje a je uděleno oprávnění k zápisu. |
-soubor X | soubor existuje a je uděleno oprávnění execute. |
několik bodů na vědomí:
- = se mírně liší od-eq. vrátí false as = provede porovnání řetězců (tj., znak pro znak stejný) vzhledem k tomu, – eq dělá číselné srovnání význam vrátí true.
- když odkazujeme na soubor výše, ve skutečnosti znamenáme cestu. Nezapomeňte, že cesta může být absolutní nebo relativní a může odkazovat na soubor nebo adresář.
- Protože to je jen odkaz na příkaz test můžeme experimentovat a potíže střílet s testem na příkazovém řádku se ujistit, že naše pochopení jeho chování je správné.
- test 001 = 1
- echo $?
- 1
- test 001-eq 1
- echo $?,
- 0
- dotkněte se myfile
- test-s myfile
- echo $?
- 1
- ls /etc > myfile
- test-s myfile
- echo $?
- 0
pojďme to rozebrat:
- řádek 1 – Proveďte porovnání založené na řetězci. Test nevytiskne výsledek, takže místo toho zkontrolujeme stav výstupu, což je to, co uděláme na dalším řádku.
- řádek 2-proměnná $? drží stav výstupu dříve spuštěného příkazu (v tomto případě test). 0 znamená Pravda (nebo úspěch). 1 = FALSE (nebo selhání).,
- řádek 4 – tentokrát provádíme číselné srovnání.
- řádek 7-Vytvořte nový prázdný soubor myfile (za předpokladu, že myfile již neexistuje).
- řádek 8 – je velikost myfile větší než nula?
- řádek 11-Přesměrujte nějaký obsah do myfile, takže jeho velikost je větší než nula.
- řádek 12-znovu otestujte velikost myfile. Tentokrát je to pravda.
odsazení
všimnete si, že ve výše uvedeném prohlášení if jsme odsadili příkazy, které byly spuštěny, pokud bylo prohlášení pravdivé., To je označováno jako odsazení a je důležitou součástí psaní dobrého, čistého kódu (v jakémkoli jazyce, nejen Bash skripty). Cílem je zlepšit čitelnost a ztížit nám dělat jednoduché, hloupé chyby. Neexistují žádná pravidla týkající se odsazení v Bash, takže můžete odsadit nebo ne odsadit, jak se vám líbí, a vaše skripty budou stále běžet přesně stejně. Já bych velmi doporučuji si udělat odsazení kódu se však (zejména pokud vaše skripty dostat větší), jinak zjistíte, že je stále obtížné vidět strukturu ve svých skriptech.,
vnořené pokud příkazy
mluví o odsazení. Zde je perfektní příklad, kdy vám to usnadní život. Můžete mít tolik, pokud prohlášení podle potřeby uvnitř skriptu. Je také možné mít prohlášení if uvnitř jiného prohlášení if. Například, budeme chtít analyzovat číslo uvedené na příkazovém řádku, tak jako:
Pojďme si rozebrat to:
- Řádek 4 – Proveďte následující, pouze pokud je první argument příkazového řádku je větší než 100.
- řádek 8 – Jedná se o světelnou variaci na příkaz if., Pokud bychom chtěli zkontrolovat výraz, můžeme použít dvojité závorky stejně jako u proměnných.
- řádek 10-spustí se pouze v případě, že jsou obě prohlášení pravdivá.
yo dawg, i stádo se vám líbí, pokud prohlášení, takže jsem dal prohlášení if uvnitř vašeho prohlášení if.
Xzibit
(Xzibit to vlastně neřekl, ale jsem si jistý, že by to udělal, kdyby hostil Pimp My bash Script.,)
můžete hnízdo tolik, pokud prohlášení, jak se vám líbí, ale jako obecné pravidlo, pokud potřebujete hnízdo více než 3 úrovní, měli byste pravděpodobně přemýšlet o reorganizaci svou logiku.
If Else
někdy chceme provést určitou sadu akcí, pokud je prohlášení pravdivé, a další sadu akcí, pokud je nepravdivé. Můžeme to pojmout jiným mechanismem.,
<příkazy>
<další příkazy>
fi
Nyní můžeme snadno číst ze souboru, pokud je dodávané jako argument příkazového řádku, jinak číst z STDIN.
else.sh
- #!/bin/bash
- # jiný příklad
- pokud
- pak
- nl $1
- ostatní
- nl /dev/stdin
- fi
Pokud Elif Jiného
Někdy můžeme mít řadu podmínek, které mohou vést různé cesty.,
<příkazy>
elif
<různé příkazy>
<další příkazy>
fi
například to může být případ, že jste-li starší 18 let, můžete jít na večírek. Pokud nejste, ale máte dopis od svých rodičů, můžete jít, ale musí být zpět před půlnocí. Jinak nemůžete jít.
můžete mít tolik poboček elif, kolik chcete. Finále je také volitelné.,
Booleovské operace
někdy chceme něco udělat, pouze pokud jsou splněny více podmínek. Jindy bychom chtěli akci provést, pokud je splněna jedna z několika podmínek. Můžeme je ubytovat s booleanskými operátory.
- a – &&
- nebo – ||
například, možná chceme jen, aby se provést operaci, pokud soubor je čitelný a má velikost větší než nula.
and.sh
- #!,/bin/bash
- # příklad:
- pokud &&
- pak
- echo Tohoto souboru je užitečné.
- fi
možná bychom chtěli provést něco trochu jiného, pokud je uživatel buď bob nebo andy.
or.sh
- #!/bin/bash
- # nebo příklad
- v případě ||
- pak
- ls-alh
- ostatní
- je
- fi
Prohlášení
Někdy si můžeme přát, aby se různé cesty založené na proměnné odpovídající sérii vzory., Mohli bychom použít řadu prohlášení if a elif, ale to by brzy vyrostlo, aby bylo unweildly. Naštěstí existuje případ prohlášení, které může dělat věci čistší., It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bash
- # příklad
- $1
- start)
- echo spuštění
- ;;
- stop)
- echo zastavení
- ;;
- restart)
- echo restartování
- ;;
- *)
- echo don\ \ ‚t vědět,
- ;;
- esac
Pojďme si rozebrat to:
- Řádek 4 – na Tomto řádku začíná casemechanism.
- řádek 5 – pokud se $1 rovná „start“, proveďte následující akce. the) znamená konec vzoru.,
- řádek 7 – identifikujeme konec této sady příkazů dvojitým Polo-dvojtečkou ( ;;). Následuje další případ, který je třeba zvážit.
- řádek 14-nezapomeňte, že test pro každý případ je vzor. * Představuje libovolný počet libovolného znaku. Je to v podstatě úlovek vše, pokud Pro pokud žádný z ostatních případů zápas. Není to nutné, ale často se používá.
- řádek 17-esac je případ dozadu a označuje, že jsme na konci prohlášení o případu. Jakékoli další příkazy poté budou provedeny normálně.
- . /case.sh start
- start
- .,/case.sh restart
- restartování
- ./case.sh bla
- nevím,
Nyní se podívejme na poněkud složitější příklad, kde vzory jsou používány trochu více.
shrnutí
aktivity
nyní se rozhodneme.
- Vytvořte bash skript, který bude mít 2 čísla jako argumenty příkazového řádku. Vytiskne se na obrazovku větší ze dvou čísel.,
- Vytvořte Bash skript, který přijme soubor jako argument příkazového řádku a analyzuje jej určitými způsoby. ego. můžete zkontrolovat, zda je soubor spustitelný nebo zapisovatelný. Pokud je to pravda, měli byste vytisknout určitou zprávu a jinou, pokud je falešná.
- Vytvořte bash skript, který vytiskne zprávu na základě toho, který den v týdnu je (např. „Šťastný hrb den“ pro Wedensday, „TGIF“ pro pátek atd.).