0. Rejstřík
- Věci, které se stávají většině lidí
- Struktura skriptu
- Tisk na obrazovce
- Číst uživatele VSTUP
- Výpočty v bash
- Podmínky
- Smyčky
- funkce
- Gettops
1. Věci, které se stávají většině lidí
/ bin / bash nebo / bin / sh
Jednou z prvních věcí, které stroj při provádění našeho skriptu dělá, je sledování, s jakým shellem by to mělo dělat. Na většině současných linuxových systémů / Bin / sh je odkaz na / bin / bash, ale není tomu tak vždy, například v distribucích, které používají busybox přinášejí Sh a obvykle také přinášejí Praštit, ale pokud používáte / Bin / sh, nebude fungovat s Bash. Proto doporučuji vždy používat / bin / bash.
Unicode vs. ASCII
Přemýšleli jste někdy, proč ve svých skriptech nemůžete použít „¿“ nebo „ñ“? Nebo použít akcenty? V interaktivních skriptech to může být docela nepříjemné. Je to proto, že výchozí kódování pro Bash je ASCII, nebo co je stejné, anglická znaková sada. Abychom to mohli změnit, musíme pouze říct našemu skriptu, že chceme používat Unicode. K tomu musíte přidat řádek hned za tlumočník příkazů:
# - * - KÓDOVÁNÍ: UTF-8 - * -
Buďte opatrní, je důležité, aby tento řádek byl na začátku skriptu.
Nastavit skript jako spustitelný
Je legrační, kolik lidí spouští skripty pomocí «$ bashscript.sh" namísto "$ ./script.sh„Koneckonců, pro tohle jsme definovali shell.
Chcete-li přidat oprávnění ke spuštění, musíte provést:
sudo + x script.sh
BIN = "složka, kde máme skripty" PATH = "$ BIN $ PATH"
2. Struktura skriptu
- Záhlaví
- Definice globálních proměnných
- pomoci
- funkce
- Hlavní tělo
Záhlaví je místo, kde označujeme, který shell chceme použít, a kódování. Výhodou funkcí je opětovné použití kódu, který se opakuje zápisem pouze jednou, a pro snazší pochopení skriptu, pro kód, který přesahuje 100 řádků, je to velmi užitečné.
Aby bylo možné používat funkce, musí být definovány s před hlavní částí našeho skriptu. A pokud chceme použít proměnné na globální úrovni celého našeho skriptu, a to jak v hlavním těle, tak ve funkcích, musíme je definovat na začátku všeho, hned za hlavičkou.
Nakonec je dobrým zvykem napsat pomocnou funkci, když náš skript běží špatně nebo se špatnými parametry. Je zřejmé, že v těchto případech chceme skript okamžitě opustit, aniž bychom museli číst funkce. K tomu můžeme použít:
function help () {echo "" "Náš dobře naformátovaný text nápovědy." "" exit if [[-z $ 1 || $ 1 == "-h" || $ 1 == "--help"]]; pak pomoz fi
Pokud do funkce nápovědy přidáme „exit“, ukončíme skript pokaždé, když spustíme nápovědu, například po chybových zprávách atd. Uložíme několik řádků kódu.
Podmínka označuje zobrazení nápovědy na obrazovce a ukončení, pokud je skript spuštěn bez parametrů nebo pokud je zadán -h / –help. Pokud se podíváte, jedná se o standardní chování většiny linuxových programů.
3. Tiskněte na obrazovku
Existují 2 hlavní příkazy pro tisk na obrazovku v bash: «minout"Y"printf«. Oba jsou stejně rychlí a oba jsou součástí bash. Hlavní rozdíl pro začátečníky je v tom, že echo na konci přidá nový řádek, zatímco «printf»Ne.
Echo je v pořádku a je to to, co většina lidí používá, ale při čtení INPUT uživatele nebo pokud chcete tisknout proměnné převzaté ze souborů zpracováním textu, mohou se stát podivné věci. Obvykle jsou snadno vyřešitelné, stejně snadné jako změna dvojitých uvozovek na jednoduché nebo naopak, nebo vyřazení proměnných odkazů z uvozovek. «Echo»Dělá podivné věci také podle toho, jak byl kompilován, pokud vždy používáme Ubuntu nebo vždy Fedoru, nemá to na nás vliv, ale pokud změníme distribuci, tak to udělá.
Proto používám «printf«, Což mě nebolí a chová se více jako«printf»Z C nebo«vytisknout»V Pythonu je to velmi důležité, pokud chcete někdy přenést skript do jiného programovacího jazyka.
4. Přečtěte si VSTUPU uživatele
Všechno, co napíšeme za názvem našeho skriptu a před stisknutím klávesy ENTER, se automaticky uloží do speciálních proměnných. Tyto proměnné jsou typu $ X, kde X je číslo.
«$0»Označuje název našeho skriptu a od«$1»Do nekonečna je vše, co jsme napsali později, variabilní. Například:
kočka << EOF >> test.sh #! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh můj soubor.txt
Vytvoříme testovací skript, uděláme jej spustitelný a spustíme ho se 2 parametry. Získáváme výstup obrazovky:
$ 0 = ./script.sh $ 1 = moje $ 2 = file.txt
Pomocí uvozovek jsme mohli předat „můj soubor.txt“ do „$ 1“.
Můžeme také číst INPUT uživatele pomocí příkazu „read“, který přímo označuje proměnnou, kam chceme parametr uložit. Například:
printf "Jaké je vaše jméno? \ n" přečíst JMÉNO printf "Dobrý den, $ NAME. \ n"
5. Výpočty v Bash
K tomu můžeme použít «expr"Dokud nebudeme muset dělat složité výpočty." Je třeba poznamenat dvě věci, první je, že «expr»Připouští pouze celá čísla, druhým je, že dělení vrací celý výsledek, abychom viděli zbytek, který můžeme použít«%".
Obvykle chceme přiřadit výsledek expr proměnné. Můžeme to udělat dvěma způsoby:
VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)
Můžete také přeskočit «expr»Použití dvojitých závorek:
VAR2 = $ (($ VAR1 / 100))
6 Podmínky
Již bylo napsáno velmi obsáhlým způsobem o «if","jiný","Elif»A podmínky. O tom si můžete přečíst v:
- Programování v Bash: část 1
- Bash: Pokud tedy platí jiné podmínky
- Pomocí smyčky if zkontrolujte, zda soubor nebo složka existuje či nikoli, a další
- Programování v Bash: část 2
Chci jen zdůraznit rozdíl mezi používáním jednoduchých hranatých závorek, «[]«, A dvojité závorky,«[[]]«, Za podmínek. U dvojitých závorek můžeme použít další podmínky:
- «&&»Pro a
- «||»Pro nebo
Použít "&&"Y"||»U jednoduchých hranatých závorek by měla být každá část oddělena v samostatných hranatých závorkách. Příklad použitý pro část skriptu, která sleduje, zda je třeba spustit pomoc, by byl:
pokud [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--help"]]; pak pomoz fi
Také nám to ušetří nutnost psát názvy proměnných do uvozovek, abychom zabránili chybám. Například:
pokud [$ 1 = 1]; then printf "Parametr je roven 1."; fi if ["$ 1" = 1]; then printf "Parametr je roven 1."; fi if [[$ 1 = 1]]; then printf "Parametr je roven 1."; fi
Pokud je soubor script.sh spuštěn bez jakýchkoli parametrů, první případ by způsobil chybu:
bash: [: =: očekává se unární operátor
O čem se ještě nemluvilo, je «případ«, Používá se ke zjednodušení«if«. Začněme na začátku, když nemáme žádné «if»Celý kód bude spuštěn. Pokud přidáme podmínku «if»Budeme mít dva případy, jeden, ve kterém blok kódu uvnitř«if»A další případ, kdy se tento blok neprovede.
Pokud přidáme «jiný«Budeme mít také dva případy, ale tyto dva případy se liší od těch předchozích. Protože nyní budou dva bloky podmíněného kódu, A a B, a blok C, což je zbytek programu. A nebo B budou provedeny a C. V předchozím případě to byly A a C nebo pouze C.
Vyhnout se podmínkám psaní «pokud / jinak" v rámci "jiný»A pro zjednodušení čtení kódu byl vytvořen«Elif«. Když máme mnoho podmínek, které závisí na předchozím, například rozsah čísel nebo typ:
VAR1 = 1 $, pokud [[$ VAR1 = 1]]; potom printf "1 \ n" elif [[$ VAR1 = 2]]; potom printf "2 \ n" elif [[$ VAR1 = 3]]; potom printf "3 \ n" else printf "žádný \ n" fi
V případě posledního «Elif»Bude přečteno mnoho podmínek. V případě, že je tento proces efektivní:
VAR1 = $ 1 případ $ VAR v 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 nebo 4, záleží \ n" ;; *) printf "none \ n" ;; že C.
Přečte se proměnná, v tomto případě VAR1, a uvidí se, zda je ekvivalentní s některým z případů, pokud ne, provede se výchozí případ „*“. Dvojité středníky jsou ekvivalentní «rozbít", Oni říkají"případ»To musí skončit.
7. Smyčky
V jakémkoli programovacím jazyce je známo velmi málo smyček. V Bash jsou «zatímco","až do"Y"for«. O tom již bylo v blogu napsáno:
Existují dva typy smyček «for«, Ty, které jsou typu«$ za VAR v LOQUESEA»A co jsou typu C«$ pro ((I = 0; I <= 10; I ++))«. Druhý typ smyček «for»Jsou velmi užitečné, má 3 části na začátku smyčky:
- Deklarace a inicializace proměnných (v tomto případě pomocná proměnná „I = 0“).
- Podmínka provedení (dokud I není menší nebo roven 10).
- Zvýšení pomocné proměnné
Podle mého názoru je to nejmocnější smyčka ze všech. Příklad, který vytiskne všechna čísla od 0 do 10, včetně:
#! / bin / bash for ((I = 0; I <= 10; I ++)); do printf "$ I \ n" hotovo
8. Funkce
Existuje několik věcí, které nám Bash neumožňuje, že? Na první pohled vám funkce bash brání ve 3 věcech: deklarování lokálních proměnných ve funkcích, předávání parametrů funkcím a vrácení parametrů. Všechno má řešení.
Nedělejte nic jako:
#! / bin / bash VAR = 1 printc "$ VAR \ n" funkce ahoj () {VAR = 2 printf "$ VAR \ n"} ahoj printf "$ VAR \ n"
Vytiskne se na obrazovku 1, 2 a 2.
Chcete-li deklarovat místní proměnné, přidejte «místní»Při deklaraci:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funkce foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Vytiskne 1, 1, 2, 1 na obrazovce.
Jak předáváte parametry funkci?
#! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - funkce ahoj () {printf "Hello $ 1 \ n"}
printf "Jak se jmenujete? \ n"
číst VAR1
ahoj $ VAR1
Jak jsou vráceny parametry?
#! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - funkce hello () {printf "Hello holita"} printf "Jak se jmenujete? \ n" číst VAR1 VAR1 = $ (ahoj) # ZDE printf "$ VAR1 $ VAR2 \ n"
Jak vidíte, má to dvě nevýhody, můžete vrátit pouze jeden parametr, kterým může být vektor 😀, a pokud chcete vrátit parametr, z této funkce již nelze tisknout na obrazovku.
9. Getops
Jedna z posledních věcí, které potřebujete o Bashovi vědět, abyste mohli vytvářet složité skripty, je «getops«. Používá se k předání voleb do skriptu bez ohledu na pořadí. Jedinou nevýhodou je, že ovlivňuje pouze krátké možnosti:
#! / bin / bash # - * - KÓDOVÁNÍ: UTF-8 - * - VARC = 0 funkce help () {printf "Zpráva nápovědy \ n" exit} pokud [[-z $ 1]]; pak pomozte fi zatímco getopts: ha: b: c OPT; udělejte případ $ OPT v h) help ;; :) Pomoc ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Pomoc ;; esac done # Hlavní blok skriptu, který # dělá věci s VARA, VARB a VARC
«Gettopts»Postupně čte možnosti, takže je potřeba smyčka.
Existují 2 typy možností, které lze předat pomocí «getopts„:
- Parametry zvané příznaky, v tomto případě -c nebo -h. Jsou specifikovány písmenem, které chceme použít. Jsou jako booleovské proměnné, «pravdivý»(Are) nebo«nepravdivý„(Nejsou tady).
- Parametry s přidruženými argumenty, -a cokoli, -b cokoli. Jsou specifikovány písmenem, které chceme, s dvojtečkou níže. Argument je uložen v OPTARG (tento název je neměnný).
Co dělá tento skript?
Zobrazí zprávu nápovědy, když není předána žádná možnost, když je předán parametr "-h", když je předán neplatný parametr (například "-x", toto je provedeno "\?") Nebo když platný parametr bez argumentu (":"). V ostatních případech uloží přítomnost "-c" jako 1 ve VARC a hodnoty předané s "-a" a "-b" ve VARA a VARB.
HLAVNĚ. Neříkám více U_U
Dobrý den, velmi dobrý článek.
Ahoj, dal jsi oprávnění sudo + x místo chmod + x
$ sudo chmod + x script.sh
(Přesněji řečeno, hehe)
Ah, gratuluji a děkuji!
Velmi dobrý příspěvek, opravdu vám blahopřeji, držte to, pozdravy
A pokud chcete, aby byl skript při spuštění viditelný, krok za krokem, abyste viděli například to, jak se chovají proměnné, podmínky a vše, můžete použít:
sh -x skript
pozdravy
Kus výchovy. Vynikající a velmi dobře vysvětleno.
Děkuju.
Vynikající příspěvek na toto téma 😉
Velmi zajímavé a velmi důležité díky za informace….
Na zdraví !!!
Děkuji vám všem za blahopřání, protože pokud jde o příkaz Miguel, nedovolí mi po zveřejnění upravit záznam. Bude to muset udělat elav, jak si představuji.
Velmi dobře!
Nejprve jsem vám chtěl poblahopřát k příspěvku, zjistil jsem, že je snadno pochopitelný a opravdu pomáhá dodržovat pokyny, abyste programovali dobře v bash, zejména pro lidi, kteří začínají programovat.
Našel jsem však několik podrobností, které by podle mě měly být opraveny.
Za prvé: v sekci «2. STRUKTURA SKRIPTU »funkce není uzavřena, což způsobí problémy při jejím provádění ve skriptu.
Řešením by bylo přidat složenou závorku hned za příkazem „exit“.
Zadruhé: v sekci «4. PŘEČTĚTE SI VSTUP UŽIVATELE “potvrzujete, že parametry, které může uživatel zadat, se pohybují v rozmezí od 0 do nekonečna, nicméně výraz„ bash “bude interpretovat pouze od 0 do 9 $, protože 10 $ by se rovnalo $ 1 + 0.
Chcete-li tento problém vyřešit, můžete pomocí příkazu „shift“ uchopit následující proměnné. Nebo zadejte proměnnou ve složených závorkách „$ {10}“, aby bash převzal hodnoty společně, nikoli jako $ 1 + 0.
Bez dalších okolků, pozdravy!
Děkuji za Váš komentář. Úplně se nepodařilo vysvětlit správné použití ukončení, a to jak ve skriptu, tak ve funkcích. Pokud jde o $ {10}, nikdy jsem tolik neodkázal, takže jsem se s tímto problémem nesetkal, je dobré vědět, že pro to existuje řešení (už jsem přeškrtl novou věc, kterou jsem se dnes naučil)
Moc děkuji za článek! Některé věci, které zmiňujete, stále chyběly objasnění. Například getops.
V části výstupů na obrazovce jste nezmínili kočku, kterou jste později zmínili ...
kočka <
***************************************
* TATO FORMA JE VELMI VÝSLOVNÁ *
***************************************
EOF
Ve vašem příkladu:
kočka << EOF >> test.sh
Je třeba zmínit dvě věci ... >> je to „append“, to znamená, že pokud zopakujete stejný příkaz, budete mít celý skript duplicitně ... Měli byste použít pouze jeden ...
kočka << EOF> script.sh
Ano, měl by se také jmenovat script.sh
Pak dovnitř
pokud [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoc"]]; pak
pomoc
fi
Myslím, že by to mělo být napsáno ...
pokud [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–pomoc"]]; pak
...
Od společnosti BASH je toho možné objevit mnohem více.
Mohli byste to pojmenovat „ZÁKLADY“? 🙂
Například parametr 'testery' jako -z, aby zjistil, zda jsou prázdné, nebo -f, aby zjistil, zda existuje jako soubor.
Ještě jednou děkujeme za vaši snahu.
Alberto
Velmi dobrý výukový program pro bash skripty!
-- KÓDOVÁNÍ: UTF-8 --
Je to poprvé, co jsem viděl tento řádek nastavit kódování znaků v bash skriptu. Zdá se to typičtější pro Python než Bash. Je to opravdu nutné? Hledal jsem odkaz na Google, ale nemohu nic najít, máte po ruce odkaz, který hovoří o této záležitosti? Konkrétně o vhodnosti této linky.
Podle mého názoru pro psaní skriptů v Bash pomocí UTF-8 stačí uložit textový soubor jako takový (bez BOM) a mít správně nastaveny určité proměnné prostředí (LANG a LC_ *).
Potom je samozřejmě nutné, aby byly prováděné příkazy připraveny pro jiná kódování než ASCII. Například pokud chceme přejít na velká písmena, nezdá se, že by to fungovalo:
«Echo áéíóú | tr az AZ »
o:
«Echo áéíóú | tr [: dolní:] [: horní:] »
a je lepší použít:
«Echo áéíóú | awk '{print toupper ($ 0)}' ».
O "kódování»V tomto blogu bylo zmíněno dříve:
Bash: jak vytvořit spustitelný skript
Skript obslužného programu po instalaci
Někdo mě opraví, ale ten kódovací řádek (# -- KÓDOVÁNÍ: UTF-8 --) Nemá to nic společného s bash nebo shellem: je to řádek komentáře (začíná na #) a slouží k tomu, aby řekl EDITOR, že používáme k psaní skriptu (vim, emacs ...) kódování souboru.
Ve skutečnosti bash takový řádek nevidí, protože je to řádek komentáře.
Skvělý výukový program, protože Sysadmin zná skriptování v Bashi, je nezbytný, je užitečný pro všechno.
Velmi velmi dobrý!
Zdravím!
V případě, že je to komukoli užitečné, je zde několik způsobů použití a příkladů pro vytvoření vlastních skriptů: https://github.com/reduardo7/hsabx
Velmi dobře. Nové věci k přidání do mých skriptů. Kódovací věc a věc printf ji neměli.
Děkuji!!!
Tak dobrý článek! Tuto si nechávám pro oblíbené, bylo by hezké opravit, co je špatně, a dokonce ji rozšířit o další obsah. Potlesk za všechny tyto informace !!!!