Denne vejledning beskriver, hvordan du nemt kan skrive dine egne Bash-scripts på Linux.

Som systemadministrator er det ret sandsynligt, at du udfører gentagne opgaver, der kunne automatiseres.

Gluksusvis for dig er der et programmeringssprog, der kan bruges på Linux til at skrive scripts : programmeringssproget Bash.

Med Bash kan du planlægge hele systembackups ved at angive så mange kommandoer, som du vil, i Bash-scripts.

Du kan også have brugerdefinerede scripts, der opretter og sletter brugere og fjerner deres tilknyttede filer.

Med Bash kan du også få scripts til at køre og dumpe nyttige præstationsmålinger til en fil eller database.

Bash er et meget kraftfuldt programmeringssprog for systemadministratorer.

I dagens tutorial vil vi lære alt det grundlæggende, der er at vide om Bash : hvordan man opretter og kører scripts, hvordan man bruger variabler og shell-build-ins effektivt.

Indholdsfortegnelse

Hvad du vil lære

Hvis du læser denne tutorial til slutningen, vil du lære om følgende begreber vedrørende Bash

  • Hvordan man opretter og kører Bash-scripts ved hjælp af kommandolinjen;
  • Hvad shebang er, og hvordan det bruges af Linux til scripting;
  • Hvad shell-build-ins er, og hvordan de adskiller sig fra almindelige systemprogrammer;
  • Hvordan man bruger Bash-variabler, og hvad specielle variabler er;
  • Hvordan man bruger Bash-kommandoerstatning;
  • Sådan bruger du simple IF-udsagn i Bash;

Som du kan se, er dette et ret langt program, så lad os uden videre begynde med at se, hvordan du kan oprette og køre Bash-scripts.

Kom i gang med Bash

Hvor vi udsender nogen kommandoer, skal vi lige have et kort ord om Bash og Shell’s fælles historie.

Historien om Bash

Den første version af Bash-shell’en blev udgivet i 1989 af Brian Fox, og den kommer som en open source-implementering af Unix-shell’en.

Dengang, da Unix-systemer begyndte at opstå, brugte sådanne systemer standard Unix-shells ved navn Bourne-shells.

Billede fra LinuxJournal

I de tidlige dage af Unix var systemer udviklet af virksomheder som MIT eller Bell Labs ikke gratis, og de var ikke open-source.

Selv om der var dokumentation til disse værktøjer, blev det en prioritet for GNU-initiativet (ledet af Richard Stallman) at få sin egen version af Unix-shellen.

Seks år efter annonceringen af GNU-projektet blev Bash-shellen (Bourne-Again Shell) født med endnu flere funktioner end den oprindelige Bourne-shell.

Bash-programmeringssprog

Når man arbejder med et Unix-lignende system som Linux, har Bash normalt to betydninger :

  • Bash er en kommandolinjefortolker eller med andre ord en Unix-shell. Det betyder, at når du åbner en terminal, vil du stå over for en Unix-shell, som for det meste er en Bash-shell.

Når du skriver kommandoer direkte i terminalen, fortolkes kommandoerne af shell’en, udføres ved hjælp af systemopkald og returværdier gives tilbage til slutbrugeren.

Hvis du ikke er sikker på den aktuelle fortolker, som du bruger, angiver miljøvariablen SHELL, hvilken shell du bruger i øjeblikket.

$ printenv SHELL

Som du kan se, bruger vi i dette tilfælde korrekt Bash-kommando-fortolkeren til at arbejde.

Det er vigtigt at bemærke, at selv om udtryk som “Bash-scripting” og “Shell-scripting” bruges i flæng, så beskriver de måske faktisk ikke det samme, afhængigt af din distribution.

Nogle nyere distributioner (såsom Debian 10) har symbolske links fra den originale Bourne shell (med navnet sh) til deres egne shell-implementeringer (i dette tilfælde Dash eller Debian Almquist shell)

  • Bash beskriver også et kommandolinjesprog, og det omtales også som Bash-sproget. Bash eksponerer et sæt af operatører og operander, der kan bruges for at få nogle grundlæggende funktioner som f.eks. piping eller udførelse af flere kommandoer på samme tid.

Når man udfører nogle grundlæggende piping-operationer, er man vant til at arbejde med symbolet “|”. Dette symbol er en del af kommandolinjesproget Bash.

Det samme gælder for symbolet “&&”, der udfører den anden kommando, hvis, og kun hvis, den første kommando lykkedes.

$ command1 && command2

Opret og kør Bash-scripts

Nu da du har en vis baggrund om Bash-shellen og Bash-kommandolinjesproget, kan vi begynde med at oprette og køre enkle Bash-scripts.

For at oprette dit første Bash-script skal du blot oprette en fil med navnet “script.sh”.

Som du sikkert allerede har bemærket, bruger vi stadig udvidelsen “sh”, der henviser til den oprindelige Bourne-shell (også betegnet som sh).

$ touch script.sh

Nu er det ikke nok at oprette en fil, der slutter med udvidelsen “sh”, for at dit script kan betragtes som et shellscript.

Du kan faktisk se, at din fil endnu ikke betragtes som et shellscript ved at køre kommandoen file.

$ file script.sh

Som du kan se her, er din fil kun beskrevet som en simpel tom fil.

For at din fil kan beskrives som en shell-script-fil, skal du angive shebang-linjen øverst i din fil.

Specificering af shell ved hjælp af shebang

Hvis du har brugt Linux i et stykke tid, er det meget sandsynligt, at du allerede er stødt på shebang-linjen i begyndelsen af din fil.

Shebang, der er en forkortelse for “Hash + “Bang”, er en en-linje, der sættes i begyndelsen af shell-scripts for at angive, hvilken shell der skal bruges til at fortolke dette script.

#!/bin/<shell>

I vores tilfælde ønsker vi at arbejde med Bash-scripts. Med andre ord ønsker vi, at vores scripts skal fortolkes af en Bash-fortolker.

For at bestemme stien til fortolkeren kan du bruge kommandoen “which”.

$ which bash/bin/bash

Nu, hvor du kender stien til din fortolker, skal du redigere din scriptfil og tilføje shebang-linjen øverst i din fil.

#!/bin/bash

Nu, hvor du har tilføjet denne linje i begyndelsen af din fil, skal du igen udføre kommandoen “file” for at se forskellen.

Som du kan se, er resultatet en smule anderledes : denne gang ses dit script som et “Bourne-Again-shell-script” og endnu vigtigere som en eksekverbar fil.

Så hvad ville der ske, hvis du ikke angiver shebang-linjen øverst i scriptet.

Når du ikke angiver shebang-linjen, køres scriptet ved hjælp af den aktuelle shell, der bruges til at starte kommandoen execute.

Nu ved du, hvordan du opretter Bash-scripts, så lad os se, hvordan du kan eksekvere dem.

Udføre Bash-scripts

For at kunne udføre Bash-scripts på Linux har du grundlæggende to muligheder :

  • Ved at angive den shell-fortolker, du vil bruge, og scriptfilen;
  • Ved at bruge stien til scriptfilen

Specificering af shell-fortolkeren

Den første metode er ret ligetil.

For at kunne udføre dit bash-script skal du selv angive den fortolker, du vil bruge.

$ bash <script>$ /bin/bash <script>

Med det eksempel, vi brugte før, ville det give os følgende output.

Som du kan se, kræver denne metode ikke engang eksekveringstilladelser på filen, du skal bare kunne bruge den eksekverbare bash-fil.

Som du kan se, kan jeg, når jeg er logget ind som en anden bruger uden execute-tilladelser, stadig udføre dette script.

Dette er en vigtig bemærkning, fordi du måske ønsker at gemme dine scriptfiler i beskyttede mapper (som kun du har adgang til) for at forhindre andre brugere i at udføre dine filer.

Angivelse af stien til scriptet

Den anden måde at udføre bash-scripts på er ved at angive stien til filen.

For at kunne bruge denne metode skal filen have udførelsestilladelser.

Først skal du bruge kommandoen “chmod” for at indstille udførelsestilladelser for den aktuelle bruger.

$ chmod u+x <script>

Som du kan se, er filfarven helt anderledes : din nuværende terminal fremhæver eksekverbare filer ved hjælp af bestemte farver, i dette tilfælde den grønne farve.

Nu, hvor dit script er eksekverbart, kan du udføre det ved at angive den relative eller absolutte sti til scriptet.

Med en fil ved navn “script.sh”, der befinder sig i min aktuelle arbejdskatalog, kan scriptet udføres ved at køre

$ ./script.sh

Hvis du befinder dig i en anden mappe, skal du angive den absolutte sti til scriptfilen.

$ /home/user/script.sh

Som du sikkert allerede har indset, er denne metode ikke særlig praktisk, hvis du skal angive stien til scriptet hver eneste gang.

Glædeligt nok for dig er der en måde at udføre dit script på ved blot at skrive filnavnet i kommandolinjen.

Tilføjelse af scriptet til PATH

Det er ikke nødvendigt med udvidelsen “.sh” for at et script kan betragtes som en scriptfil.

For enkelhedens skyld vil vi omdøbe den eksisterende “script.sh”-filen til “script”.

For at omdøbe filer på Linux skal du blot bruge kommandoen “mv” og angive kilde- og destinationsmålene.

$ mv script.sh script

Hvad nu, hvis du ønsker at udføre dit script ved at skrive “script”?

For at kunne gøre det skal du tilføje stien til dit script til din PATH-miljøvariabel.

For at udskrive den aktuelle værdi af din PATH-miljøvariabel skal du bruge “printenv” med argumentet “PATH”.

$ printenv PATH

For at opdatere PATH i dit nuværende arbejdsmiljø skal du redigere PATH-miljøvariablen med følgende syntaks:

$ export PATH="<path_to_script>:$PATH"

Nu vil kommandoen “script”, som du lige har defineret, være direkte tilgængelig uden at angive nogen stier : du kan starte den som alle andre kommandoer.

Bemærk : hvis du vil gøre dine ændringer permanente, skal du følge disse trin for at opdatere din PATH-variabel korrekt.

Shell built-ins forklaret

Hvor du deklarerer variabler i dit shell-script, er det vigtigt for dig at kende til shell built-ins.

Når du arbejder med Bash-shell’en, udfører du for det meste “programmer”.

Eksempler på programmer er “ls”, “fdisk” eller “mkdir”. Hjælp til disse kommandoer kan du finde ved at bruge kommandoen “man”, der er en forkortelse for “manual”.

Har du imidlertid nogensinde prøvet at læse dokumentationen for kommandoen “source”?

Du ville ikke kunne læse dokumentationen ved hjælp af “man”, fordi kommandoen “source” er en indbygget funktion i skallen.

For at læse dokumentationen for indbyggede funktioner i skallen skal du bruge kommandoen “help”.

$ help <command>

Listen over indbyggede shell-funktioner er ret omfattende, men her er et skærmbillede af hver enkelt indbygget bash-kommando, som du kan finde på Ubuntu-systemer.

Brug af Bash-variabler

Nu, hvor du kender til Bash-indsætninger, er det tid for dig at begynde at skrive dine egne Bash-scripts.

Som en påmindelse kan de kommandoer, der indtastes i din terminal, bruges i et Bash-script på nøjagtig samme måde.

For eksempel, hvis du vil have et script, der blot udfører kommandoen “ls -l”, skal du blot redigere dit script, tilføje shebang-linjen og kommandoen.

#!/bin/bash# This simple script executes the ls commandls -l

Hvad nu, hvis du ville have Bash-variabler?

Bash-variabler er simple programvariabler, der kan gemme en lang række forskellige input.

For at deklarere en Bash-variabel skal du blot angive navnet på variablen og dens værdi adskilt af et lighedstegn.

VAR=value

For at kunne bruge indholdet af din Bash-variabel i dit script skal du bruge “$” og tilføje navnet på din variabel.

echo $VAR

Selv om du kan bruge denne syntaks for at have variablens værdi, kan du også bruge “parentes”-notationen.

echo ${VAR}

Med denne syntaks kan variabler kombineres sammen.

Hvis du f.eks. har to Bash-variabler med navnene VAR1 og VAR2, kan du få dem begge udskrevet ved hjælp af følgende syntaks

echo "${VAR1}${VAR2}"

Udførelse af kommandoer inden for scripts

For at kunne udføre kommandoer inden for Bash-scripts skal du bruge kommandoerstatning.

Kommandosubstitution er en teknik, der bruges i Bash-shells for at gemme resultatet af en kommando i en variabel.

For at substituere en kommando i Bash skal du bruge dollartegnet og omslutte din kommando i parenteser.

VAR=$(command)

For eksempel, for at få resultatet af antallet af filer i din aktuelle mappe, ville du skrive

#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"

Som du kan se, er kommandosubstitution ret praktisk, fordi den kan bruges til dynamisk at udføre kommandoer i et shellscript og returnere værdien tilbage til brugeren.

Såsom vi taler om at returnere resultater til slutbrugeren, hvordan håndterer du så scripts, der ikke afsluttes korrekt?

Hvad sker der, hvis en kommando inde i scriptet ikke blev udført korrekt?

Forståelse af afslutningsstatus

Når du udfører et script, selv om du ikke returnerer en værdi, returnerer scriptet altid det, vi kalder “en afslutningsstatus”.

En afslutningsstatus i Bash-scripting angiver, om scriptudførelsen var vellykket eller ej.

Hvis statuskoden er nul, var din scriptudførelse vellykket. Hvis værdien imidlertid er noget andet end nul (f.eks. en, to eller flere), angiver det, at scriptudførelsen ikke lykkedes.

For at demonstrere exitstatus skal du køre en hvilken som helst gyldig kommando i din bash-shell.

echo "This is a simple working command"

Nu skal du bruge denne kommando for at inspicere exit-status for den sidst udførte kommando.

echo ${?}

Som du kan se, er output af denne kommando “0” eller exit-status for den sidst udførte kommando, jeg udførte.

Denne syntaks (“${?}”) kan bruges i scripts for at sikre, at kommandoer udføres korrekt.

Slutstatus kan bruges i scripts for at afslutte scriptet med en bestemt statuskode.

For eksempel, hvis du vil afslutte scriptet med en fejl, kan du bruge følgende kommando i dit script.

exit 1

Sådan kan du også bruge exitkoden “zero” for at angive, at scriptet blev udført med succes.

exit 0

For at kontrollere, om statuskoden var korrekt, har du brug for grundlæggende betingede udsagn som f.eks. IF-udsagnet.

Manipulering af betingelser i Bash

I nogle tilfælde handler det at udføre bash-scripts ikke kun om at have flere kommandoer ved siden af hinanden: du ønsker at have betingede handlinger.

I nogle tilfælde kan det være praktisk at have en betingelse, der kontrollerer, om den aktuelle bruger er root-brugeren (eller blot en bestemt bruger på dit system).

En simpel måde at have betingelser i Bash er at bruge if-erklæringen.

“If” er shell indbygget, som følge heraf er manualen tilgængelig via kommandoen “help”

$ help if

Hjælpesiden beskriver syntaksen for if-kommandoen ved hjælp af semikolon, men vi vil bruge denne syntaks (som er ækvivalent)

if ]then <commands>else <command>fi

Praksistilfælde : kontrol af om brugeren er root

For at vise, hvad if-anvisningen kan bruges til, vil vi skrive et simpelt script, der kontrollerer, om en bruger er root-bruger eller ej.

Som en påmindelse har root-brugeren altid UID’et sat til nul på ethvert Unix-system.

Ved kendskab til denne information vil vi kontrollere, om UID’et er sat til nul, hvis dette er tilfældet, vil vi udføre resten af scriptet, ellers vil vi afslutte scriptet.

Som forklaret i andre tutorials (om brugeradministration), kan du få det aktuelle bruger-id ved at bruge kommandoen “id”.

$ id -u1000

Vi vil bruge denne kommando for at kontrollere, om brugeren, der udfører scriptet, er root eller ej.

Opret et nyt script, og tilføj shebang-linjen til det.

#!/bin/bash

Højst under den skal du tilføje kommandoen “id” og gemme resultatet i en variabel ved navn “USERID” ved hjælp af kommandoerstatning.

USERID=$(id -u)

Nu, hvor “USERID” indeholder det aktuelle bruger-id, skal du bruge en IF-anvisning for at kontrollere, om bruger-id’et er nul eller ej.

Hvis det er tilfældet, skal du skrive en simpel informationsmeddelelse, hvis det ikke er tilfældet, skal du afslutte scriptet med exit-status 1.

if ]then echo "This is root"else exit 1fi

Nu, hvis du udfører scriptet som din nuværende bruger, vil scriptet simpelthen afsluttes med en exit-status på 1.

Prøv nu at udføre scriptet som root-bruger (med kommandoen sudo)

Som du kan se, blev din informationsmeddelelse vist, og scriptet afsluttedes med en fejlkode på nul.

Slutning

I denne vejledning lærte du om programmeringssproget Bash, og hvordan det kan bruges til at oprette Bash-scripts på dit system.

Du lærte også om exit-statusser og betingede udsagn, som er vigtige for at få indstillet brugerdefineret logik i dine scripts.

Nu, hvor du har mere viden om Bash, bør du begynde at skrive dine egne scripts til dine behov : du kan f.eks. starte med at få en tutorial om at oprette arkivbackupfiler.

Hvis du er interesseret i Linux Systemadministration, har vi en komplet sektion dedikeret til det på hjemmesiden, så sørg for at tjekke den ud!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.