Permalänk
Medlem

Vill lära mig scripta i Bash

Vill studera till nätverkstekniker framöver och jobba mycket i Linux. Blev lite intresserad av att börja lära mig scripta i Bash. Har lite frågor:

  • Finns det någonstans där man kan lära sig genom video eller liknande Codeacademy för Bash? (Gratis eller kostnad spelar ingen roll, kan man få certifikat?)

  • Vad är i stort sätt möjligt med Bash? Kan man åstakomma stora projekt (om man vill)?

  • Vad är inte möjligt med språket om man jämför med t.ex. Python?

  • Hur mycket skiljer sig Bash i Unix än Linux? Bör jag istället köra VM med en Linuxdist?

  • Övriga rekommendationer?

Är hyfsat bekant med Linux och dess pakethanterare, men vill lära mig så mycket jag kan och kunna automatisera vissa processer och få en bättre förståelse hur Linux fungerar.

Permalänk
Medlem
Skrivet av zru:

Finns det någonstans där man kan lära sig genom video eller liknande Codeacademy för Bash? (Gratis eller kostnad spelar ingen roll, kan man få certifikat?)

Det finns säkert, men inget jag känner till. Men kolla in Advanced Bash-Scripting Guide, den går igenom allt som är värt att veta om Bash som skriptspråk.

Skrivet av zru:

Vad är i stort sätt möjligt med Bash? Kan man åstakomma stora projekt (om man vill)?
Vad är inte möjligt med språket om man jämför med t.ex. Python?

Bash är vad jag vet turingkomplett, dvs. det går att utföra vilka beräkningar som helst givet tillräckligt med minne och tid. Man kan med lite vilja göra vad som helst med Bash alltså. Men det är ju egentligen menat som ett skriptspråk för automatisering, så att skriva ett större projekt i Bash blir snabbt otympligt.

Skrivet av zru:

Hur mycket skiljer sig Bash i Unix än Linux? Bör jag istället köra VM med en Linuxdist?

Unix är en familj av operativsystem, medan Linux brukar sägas vara en Unix-klon. Så din fråga är lite konstig. Bash är dock Bash, så ett Bash-skript borde i teorin fungera på alla OS med Bash. Men i praktiken finns det säkert massor av små och irriterande skillnader, som det brukar vara.

Skrivet av zru:

Övriga rekommendationer?

Du kan ju även kolla in Perl, som är ett populärt språk bland systemadministatörer och nätverkstekniker.

Permalänk
Medlem
Skrivet av perost:

Unix är en familj av operativsystem, medan Linux brukar sägas vara en Unix-klon. Så din fråga är lite konstig. Bash är dock Bash, så ett Bash-skript borde i teorin fungera på alla OS med Bash. Men i praktiken finns det säkert massor av små och irriterande skillnader, som det brukar vara.

Det jag syftade på var OS X med Bash, men jag tror det finns en pakethanterare som heter Rudix till OS X där man kan ladda ner Bash, vet ej om det gör någon större skillnad än vad som redan existerar på operativsystemet.

Hur som helst tack för svaren på alla punkter, bra länk du gav (Advanced Bash-Scripting Guide). Ska plöja igenom. Men om någon vet någon videoserie eller liknande som jag skrev ovan så är det väldigt uppskattat.

Permalänk
Skrivet av zru:

Vad är i stort sätt möjligt med Bash?

Som perost skriver: Allt är möjligt! Däremot är det långt i från allt som är enklast att göra i bash.
Språkets bästa egenskaper är att det finns nästan överallt, har en jämnt sluttande inlärningskurva och är enkelt experimentera med.

Citat:

Kan man åstakomma stora projekt (om man vill)?

Ja, men om man på förväg känner på sig att lösningen kommer att bli komplex bör man välja något annat. Språket i sig har inget vidare stöd för modularisering, t ex. Bash' syntax har också stöd för diverse olika sätt att uttrycka samma sak vilket gör att man bör sätta upp en ganska restriktiv kodningsstandard inom teamet innan man börjar bygga något större.

Citat:

Vad är inte möjligt med språket om man jämför med t.ex. Python?

  • Komplexa datatyper. Visst, det går att bygga något som liknar struct() i C genom att använda nästade arrayer eller andra knep, men det är smärtsamt och det saknas färdiga verktyg för datatypsvalidering.

  • Felhanteringen i bash är skräp. I bland får man rejäla "goddag yxskaft"-felmeddelanden.

Citat:

Hur mycket skiljer sig Bash i Unix än Linux? Bör jag istället köra VM med en Linuxdist?

Njae, grunderna är nog tillräckligt lika för att valfri variant av bash ska duga.

Citat:

Är hyfsat bekant med Linux och dess pakethanterare, men vill lära mig så mycket jag kan och kunna automatisera vissa processer och få en bättre förståelse hur Linux fungerar.

Det låter som en vettig ansats. Tänk dock på att inte drabbas av "golden hammer"-syndromet: Ja, allt kan göras i Bash, men ofta finns det specialverktyg (Puppet/Chef/Ansible för automatisering av systemförändringar) som är trevligare att använda.

Permalänk
Hedersmedlem
Skrivet av zru:

Det jag syftade på var OS X med Bash, men jag tror det finns en pakethanterare som heter Rudix till OS X där man kan ladda ner Bash, vet ej om det gör någon större skillnad än vad som redan existerar på operativsystemet.

Som skrevs ovan: Bash är Bash, oavsett vilket system du kör det på. Har du Bash installerat så har du (OS X kommer med Bash som standard, vad jag vet). Sedan kan det finnas skillnader mellan äldre och nyare versioner av Bash, men det är sällan ett bekymmer i min erfarenhet, då det är ett moget projekt.

Vad du kanske egentligen menar när du skriver Bash är "shell script", dvs generella skalskript. Bash är ett skal bland många, men den gemensamma nämnaren är snarare det som är definierat i POSIX.

Bash är (med rätta) populärt att använda som interaktivt skal, dvs det gränssnitt som gäller när du skriver i "terminalen". Bash kommer med stöd för tangentbordskommandon, tabbkomplettering och en mängd saker, inte minst genom dess Readline-integrering.

När man skriver ett skalskript i en fil och ber systemet exekvera denna så bestämmer man ofta tolk genom en shebang i början av filen. Skriver man

#!/bin/bash

så säger man åt systemet att använda just Bash som tolk. Dock så kommer du märka att det är klart vanligare ("citation needed", men men) att se

#!/bin/sh

vilket kan betyda Bash, beroende på system, men inte måste göra det. På Debian-baserade system (Ubuntu, Mint, etc.) så betyder det inte Bash, utan Dash. Dash är tänkt att vara ett strikt POSIX-kompatibelt skal utan alla "bells and whistles" som Bash inkluderar. Detta gör att Dash i jämförelse med Bash är

  • snabbare: det är mindre bagage att behöva dra igång, färre konstruktioner att behöva tolka, etc.

  • säkrare: med mindre funktionalitet är det mycket lättare att säkra upp kodbasen (cf. shell shock).

Ubuntus wiki har en del övergripande information om varför ändringen gjordes och om skillnaderna mellan skalen. Notera alltså att dessa system fortfarande använder Bash som standard för interaktiv användning, men Dash som standard för icke-interaktiva (dvs som körs utan att användaren själv skriver varje rad i tolken) skript.

För att stanna lite på "shell shock"-spåret så var en majoritet av problemet där att många system (exempelvis RHEL-baserade sådana) använde Bash som /bin/sh, vilket gjorde att när ett hål i Bashs mycket större kodbas upptäcktes så var helt plötsligt alla skalskript i skottgluggen, även de som egentligen absolut inte behövde köras med Bash, och inte ens explicit angavs med en sådan shebang. Läxa: använd inte Bash till icke-interaktiva skript om det inte är nödvändigt (vilket det sällan är).

Så: när du säger att du vill lära dig skripta i Bash så menar du nog egentligen att du vill lära dig "shell script". Bash kan enkelt sägas vara en utökad variant av detta.

Själv försöker jag vara väldigt tydlig med att bara skriva #!/bin/bash och använda dessa utökade funktioner när det verkligen, verkligen behövs (och det är ultrafel att skriva #!/bin/sh och ändå kallt anta att det betyder "Bash", vilket folk fortfarande gör i tid och otid, vilket sänker portabiliteten till fotknölarna). Personligen så brukar det handla om rätt exotiska situationer där man märker att Bashs vektorhantering skulle kunna förenkla saker betydligt, men i all ärlighet så om skriptet börjar bli alltför komplext så är det ofta värt att gå över till exempelvis Python i stället (efter att ha skrivit min beskärda del av både Perl och Python så väljer jag medvetet att inte förespråka Perl här, men det kan vara material för en separat flametråd… ).


Ett större problem vad gäller kompatibilitet mellan olika system när man skriptar (dvs om vi antar att man lärt sig skillnaden mellan Bash och POSIX) är vilken version av sidoprogrammen som finns installerade.

En typisk sak med skalskript är att man kallar på externa klassiska *nix-verktyg som mv, find, grep, sed, awk, etc., och sitter du på ett fullskaligt Linuxbaserat system så är detta ofta synonymt med GNU:s varianter av dessa verktyg, som ofta har lite extra (oerhört smidig) funktionalitet inkluderad — lite analogt med förhållandet mellan Bash och POSIX-skript. Utgår man då ifrån att dessa specialfunktioner existerar så går saker lätt åt pipan om man flyttar sina skript till ett system som kanske använder BSD-verktygen eller minimala uppsättningar som Busybox. De senare nämnda följer också POSIX-specifikationerna för sina respektive verktyg, men GNU-versionerna lägger alltså till lite extra saker. Exempelvis OS X använder inte GNU-verktygen som standard (åtminstone kan man inte förlita sig på det).

Skillnaderna mellan verktygen är dokumenterade, och så länge man är medveten om att det kan vara skillnad så lär man sig dessa med tiden.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Så: när du säger att du vill lära dig skripta i Bash så menar du nog egentligen att du vill lära dig "shell script". Bash kan enkelt sägas vara en utökad variant av detta.

Ja, det har du nog helt rätt i. Shell Script är det jag tänker på då. Vet du några bra tutorials eller är det Advanced Bash-Scripting Guide som perost tidigare länkade till det optimala?

Väldigt informativt inlägg, phz. När jag ändå har dig på tråden. Finns det något annat jag bör ha i åtanke att lära mig som gör att jag kan få en bredare kunskap om Linux?

Permalänk
Hedersmedlem
Skrivet av zru:

Ja, det har du nog helt rätt i. Shell Script är det jag tänker på då. Vet du några bra tutorials eller är det Advanced Bash-Scripting Guide som perost tidigare länkade till det optimala?

"Learning by doing" är i mina ögon sätt nummer 1, med god marginal. Kom på något du själv har användning av att automatisera och skriv skript för detta. Under tiden så kommer du googla vilt, och då trilla in på ställen som Greg's wiki (handlar om Bash, men överlappet är rätt stort, förutom när det inte är det ), Superuser och Unix.SX där du förhoppningsvis lär dig något av värde. Jag tror att shell script i synnerhet är svårt att "lära sig" syntetiskt, dvs genom att bara titta på andras exempel. Använder du terminalen i ett *nix-system praktiskt så kommer du under tiden organiskt se tillfällen för skriptande. Jag har tidigare skrivit något liknande här på forumet.

Introduction to the Command Line [FLOSS Manuals] är annars en någorlunda trevlig och lättsmält introduktion till många aspekter av terminalen. The Bash Guide är en annan mer massiv introduktion till specifikt Bash (en sorts återfödelse av Greg's wiki enligt upphovspersonen), men som sagt är det en del överlapp.

Skriptspråket i sig är rätt begränsat i någon mån, så det tar inte lång tid att lära sig definiera variabler och skriva villkorssatser, loopar och funktioner. Det som tar tid att få in är en mängd detaljer, så som hur

  • regler för fältsplittning fungerar (vad är $IFS och varför behöver man bry sig?)

  • felhantering sköts; hur man använder trap och hanterar signaler

  • vettiga gränssnitt för skript definieras; hur getopts fungerar

  • alla skrymslen och vrår av variabelsubstitution/interpolation ser ut, och hur detta kan sköta den mesta stränghanteringen direkt i skalet

  • saker som pipes, buffring, fildeskriptorer, subskal, etc., fungerar och interagerar

och mycket mer därtill. Liksom nämnts så är en annan viktig läxa att lära sig vad man inte bör använda skalskript till, dvs att veta när man bör "överge skeppet". Det lär man sig ofta den hårda vägen.

Dessutom ligger den allra största styrkan i shell script i att ha koll på andra verktyg. Man bör ha viss pejl på cp, mv, ln, cut, find, sort, head, tail, stat, tr, wc, uniq, etc., och veta när de passar att använda. Dessutom bör man kunna hantera grep, sed, awk, etc., som på många sätt är fullständiga språk helt på egen hand.

Det kan låta som mycket, och det är det, men jag skulle säga att det åtminstone inte är speciellt komplicerat (möjligen förutom sed och framför allt awk ). Dessutom så är det alltså kunskap som enklast "sipprar in" närapå automatiskt genom långvarig och regelbunden användning av *nix-system.

Skrivet av zru:

Väldigt informativt inlägg, phz. När jag ändå har dig på tråden. Finns det något annat jag bör ha i åtanke att lära mig som gör att jag kan få en bredare kunskap om Linux?

Jag har från en säker källa hört att informationen i FAQ-tråden Introduktion till och överblick av Linux och övriga operativsystem är av högsta klass!

Meningsbyggnad.
Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av zru:

Vill studera till nätverkstekniker framöver och jobba mycket i Linux. Blev lite intresserad av att börja lära mig scripta i Bash. Har lite frågor:

Tänk över vad du vill arbeta med, för nätverk och linux är inte samma sak. Om du är ute efter att jobba som tekniker i drift/övervakning så kan Linux och skriptning förekomma, men det ligger oftast på meriterade kunskaper som du kan lära dig, över kunskapskrav.

Du kanske är mer ute efter jobb inom arbete som virtualiserings ingenjör eller liknande.

Vad gäller skript språk, iaf på nätverks sidan så är Bash, TCL/TK, Pearl, Python och ibland Powershell relevant, beroende på vilket företag du jobbar hos.

Om du är intresserad så kan du alltid köpa böcker, som t.ex "Linux command line and shell scripting bible" via Adlibris. Annars så får du väl leta efter utbildnings material, om du är villig att betala så finns t.ex Udemy.

Permalänk
Medlem
Skrivet av zru:

Vill studera till nätverkstekniker framöver och jobba mycket i Linux. Blev lite intresserad av att börja lära mig scripta i Bash. Har lite frågor:

Skulle rekommendera dig att börja med portabla shellscript, dvs börja med ett shell som enbart stödjer POSIX. Detta för att lära dig urskilja vad som klassas som bashism(bash-specifika avvikelser). Så börja med dash är min rekommendation. Bash är även långsammare än dash.

Skrivet av zru:

Finns det någonstans där man kan lära sig genom video eller liknande Codeacademy för Bash? (Gratis eller kostnad spelar ingen roll, kan man få certifikat?)

Lägg inte för stor vikt vid certifikat. På min arbetsplats skämtar man mest om certifikat, det viktiga är förståelse och vad du kan prestera. Gällande dokumentation så kan man alltid vända sig till mansidorna.

man dash

Kan även rekommendera boken "Portable Shell Scripting".
http://www.adlibris.com/se/bok/beginning-portable-shell-scrip...

Skrivet av zru:

Vad är i stort sätt möjligt med Bash? Kan man åstakomma stora projekt (om man vill)?

Skulle nog avråda från stora projekt eftersom det anses vara ett långsamt scriptspråk.

Skrivet av zru:

Vad är inte möjligt med språket om man jämför med t.ex. Python?

Objektorientering

Skrivet av zru:
  • Hur mycket skiljer sig Bash i Unix än Linux? Bör jag istället köra VM med en Linuxdist?

  • Övriga rekommendationer?

Är hyfsat bekant med Linux och dess pakethanterare, men vill lära mig så mycket jag kan och kunna automatisera vissa processer och få en bättre förståelse hur Linux fungerar.

Håller med tidigare talare. Det du säger hänger inte riktigt ihop. Brukar vara uppdelat mellan att drifta närverk eller drifta linuxservrar som är kopplade mot nätverk. Djupare så handlar det om att utveckla nätverksrelaterade bitar i ett linuxsystem.

Att känna till pakethanterare är väl bra men absolut inte kritiskt, inte mer än grundläggande kännedom om vilken pakethanterare som de största distarna använder sig av. Känns snarare som du borde lägga energi på att lära dig komponenterna i ett linuxsystem. Finns mycket som redan är automatiserat man måste bara känna till vilka script/binärer som finns tillgängliga och hur de hör ihop.

Permalänk
Medlem

Om du vill komma igång med Linux och är ganska ny kan jag rekommendera boken "The Linux Command Line": http://linuxcommand.org/tlcl.php

Sen kan jag rekommendera en gratis kurs på EdX som jag tycker är väldigt bred, tar upp allt från enklare saker (som byta mapp) till mer avancerade kommandon:
https://www.edx.org/course/introduction-linux-linuxfoundation...

Kursen tar upp och exemplifierar mycket av kommandon som nämnts tidigare i den här tråden, t.ex. awk, sed, sort, uniq, grep m.fl.

För lite mer om hur det är att administrera Linux i t.ex. en liten företagsmiljö finns boken "The Debian Administrator's handbook", finns att ladda hem gratis: https://debian-handbook.info/

Jag har också haft en del nytta av "The Official Ubuntu Server Book", men senaste utgåvan är lite gammal nu tycker jag.

Det intressanta med de två sistnämnda böckerna är att man får lite insikt i hur utvecklarna ser på olika delar av systemet och vilket "best practise" de rekommenderar.

Visa signatur

AMD Ryzen 7 5700X, ASUS ROG Crosshair VIII Dark Hero, 32GB Corsair Vengeance LP 3200MHz, Gigabyte Radeon RX 5600 XT, Fractal Design Define C, Sesonic FOCUS PX 650W.