Bash teori

/ bin / bash

0. Indeks

  1. Ting der sker for de fleste mennesker
  2. Struktur af et script
  3. Udskriv på skærmen
  4. Læs brugerINPUT
  5. Beregninger i bash
  6. Betingelser
  7. Sløjfer
  8. funktioner
  9. getops

1. Ting der sker for de fleste mennesker

/ bin / bash eller / bin / sh

En af de første ting, maskinen gør, når den udfører vores script, er at se på, hvilken skal den skal gøre det med. På de fleste aktuelle linux-systemer / Bin / sh er et link til / bin / bash, men dette er ikke altid tilfældet, for eksempel i distributioner, der bruger busybox Traen Sh og normalt medbringer de også Bash, men hvis du bruger / Bin / sh, det kører ikke med Bash. Derfor anbefaler jeg altid at bruge / bin / bash.

Unicode vs. ASCII

Har du nogensinde spekuleret på, hvorfor du ikke kan bruge "¿" eller "ñ" i dine scripts? Eller bruge accenter? Det kan være ret irriterende i interaktive scripts. Det skyldes, at standardkodningen af ​​Bash er ASCII, eller hvad der er det samme, det engelske tegnsæt. For at ændre det behøver vi kun fortælle vores script, at vi vil bruge Unicode. Til det skal du tilføje en linje lige efter kommandotolken:

# - * - KODNING: UTF-8 - * -

Vær forsigtig, det er vigtigt, at denne linje er i begyndelsen af ​​scriptet.

Gør scriptet eksekverbart

Det er sjovt, hvor mange mennesker kører scripts med «$ bashscript.sh" i stedet for "$ ./script.sh»Når alt kommer til alt, det er det, vi har defineret en skal til.

For at tilføje eksekveringstilladelser skal du udføre:

sudo + x script.sh
Hvis vores script er eksekverbart, kan vi tilføje det til vores PATH og gøre det eksekverbart fra hvor som helst / mappe på vores computer. Til det skal vi tilføje enten til .bashrc for vores bruger eller til / etc / bashrc linjen
BIN = "mappe hvor vi har scripts" PATH = "$ BIN $ PATH"
Det er en Bash-regel at skrive variabelnavne med store bogstaver. Mange mennesker følger ikke denne regel, men for lange scripts værdsættes det, fordi de gør dem meget mere læsbare

2. Struktur af et script

  1. hoved
  2. Definition af globale variabler
  3. hjælpe
  4. funktioner
  5. Hovedlegeme

Overskriften er, hvor vi angiver, hvilken skal vi vil bruge, og kodningen. Fordelen ved funktionerne er at genbruge kode, der gentages ved kun at skrive den en gang og gøre det lettere at forstå scriptet, for kode, der overstiger 100 linjer, er det meget nyttigt.

For at kunne bruge funktioner skal de defineres før hovedteksten i vores script. Og hvis vi vil bruge variabler på globalt niveau i hele vores script, både i hoveddelen og i funktionerne, skal vi definere dem i begyndelsen af ​​alt lige efter overskriften.

Endelig er det god praksis at skrive en hjælperfunktion til når vores script kører dårligt eller med dårlige parametre. Det er klart, at i disse tilfælde vil vi straks afslutte scriptet uden at læse funktionerne. Til det kan vi bruge:

funktionshjælp () {echo "" "Vores velformaterede hjælpetekst." "" Afslut hvis [[-z $ 1 || $ 1 == "-h" || $ 1 == "--hjælp"]]; hjælp derefter fi

Hvis vi tilføjer "exit" til hjælpefunktionen, afslutter vi scriptet hver gang vi kører hjælp, for eksempel efter fejlmeddelelser osv. Vi gemmer et par kodelinjer.

Betingelsen angiver visningshjælp på skærmen og afslut, hvis scriptet køres uden parametre, eller hvis -h / –help er angivet. Hvis du ser, er det standardadfærden for de fleste linux-programmer.

Brug af de 3 anførselstegn med ekko gør det muligt at bruge linjeskift uden at lade meddelelsen blive vist med ekko. For meddelelser med flere linjer er det meget mere praktisk at bruge ekko kun en gang.

3. Udskriv på skærmen

Der er to hovedkommandoer til udskrivning til skærm i bash: «ekko»Y«printf«. De er begge lige så hurtige, og begge er en del af bash. Den største forskel for en nybegynder er, at ekko tilføjer en ny linje i slutningen, mens «printf"Gør ikke.

Ekko er fint og er, hvad de fleste bruger, men når de læser brugerens INPUT, eller når du vil udskrive variabler taget fra filer ved tekstbehandling, kan der ske mærkelige ting. De løses normalt let, lige så let som at ændre de dobbelte anførselstegn til enkelt eller omvendt eller tage de variable referencer ud af citaterne. «Echo»Gør mærkelige ting også afhængigt af hvordan det blev kompileret, hvis vi altid bruger Ubuntu eller altid Fedora, påvirker det ikke os, men hvis vi ændrer distributionen gør det.

Derfor bruger jeg «printf«, Som ikke giver mig hovedpine og også opfører sig mere som«printf»Fra C eller«trykke»Af Python er dette meget vigtigt, hvis du nogensinde vil overføre dit script til et andet programmeringssprog.

For en mere omfattende diskussion kan du besøge dette spørgsmål fra Unix & Linux på Stack Exchange.

4. Læs brugerINPUT

Alt, hvad vi skriver efter navnet på vores script, og inden vi trykker på ENTER-tasten, gemmes automatisk i specielle variabler. Disse variabler er af typen $ X, hvor X er et tal.

«$0»Angiver navnet på vores script og fra«$1»Alt det uendelige er uendeligt variabelt. For eksempel:

kat << EOF >> test.sh #! / bin / bash # - * - KODNING: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh min fil.txt

Vi opretter et test script, gør det eksekverbart og kører det med 2 parametre. Vi får skærmoutputtet af:

$ 0 = ./script.sh $ 1 = min $ 2 = file.txt

Ved at bruge citater kunne vi have sendt "min fil.txt" til "$ 1".

Vi kan også læse INPUT fra en bruger med kommandoen "læse", hvilket direkte angiver variablen, hvor vi vil gemme parameteren. For eksempel:

printf "Hvad hedder du? \ n" læs NAVN printf "Hej, $ NAME. \ n"
Vær forsigtig med tildelingen af ​​variabler. "$ VAR = indhold" producerer en fejl, der kan ikke efterlades mellemrum mellem lighedstegnet, variabelnavnet og indholdet. Den korrekte anvendelse er "VAR = indhold"

5. Beregninger i bash

Til det kan vi bruge «expr«Så længe vi ikke behøver at foretage komplekse beregninger. To ting skal bemærkes, den første er, at «expr»Indrømmer kun hele tal, det andet er, at division returnerer hele resultatet for at se resten, vi kan bruge«%".

Normalt vil vi tildele resultatet af expr til en variabel. Vi kan gøre det på to måder:

VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)

Du kan også springe over «expr»Brug af dobbelte parenteser:

VAR2 = $ (($ VAR1 / 100))
For en yderligere forklaring af «expr»Eller et alternativ, der bruger hele tal, kan du se på denne KZKG ^ gaara-post.

6. vilkår

Det er allerede skrevet på en meget omfattende måde om «if""andet""Elif»Og betingelser. Du kan læse om det i:

Jeg vil bare fremhæve forskellen mellem brugen af ​​enkle firkantede parenteser, «[]«, Og dobbelte parenteser,«[[]]«, For betingelserne. Med dobbelte parenteser kan vi bruge yderligere betingelser:

  • «&&»For og
  • «||»For eller

At bruge "&&»Y«||»Med enkle firkantede parenteser skal hver del adskilles i separate firkantede parenteser. Eksemplet, der bruges til den del af scriptet, der ser ud til, om hjælp skal køres, ville være:

hvis [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "- hjælp"]]; hjælp derefter fi

Det sparer os også for at skulle skrive variabelnavne i anførselstegn for at forhindre fejl. For eksempel:

hvis [$ 1 = 1]; derefter printf "Parameteren er lig med 1."; fi hvis ["$ 1" = 1]; derefter printf "Parameteren er lig med 1."; fi hvis [[$ 1 = 1]]; derefter printf "Parameteren er lig med 1."; fi

Hvis script.sh køres uden parametre, vil det første tilfælde give en fejl:

bash: [: =: forventet unary operatør
I Bash fortolkes "=" og "==" begge på samme måde. Dette sker ikke i andre programmeringssprog, hvor "=" kun bruges til at tildele variabler.

Hvad der ikke er talt om er «tilfælde«, Som bruges til at forenkle«if«. Lad os starte i starten, når vi ikke har nogen «if»Al kode udføres. Hvis vi tilføjer en betingelse «if»Vi har to tilfælde, hvor den ene blok med kode inde i«if»Og det andet tilfælde, hvor denne blok ikke udføres.

Hvis vi tilføjer en «andet«Vi har også to sager, men disse to sager er forskellige fra de foregående. For nu vil der være to betingede kodeblokke, A og B, og en C-blok, som er resten af ​​programmet. A eller B vil blive udført, og C. I det foregående tilfælde var det A og C eller kun C.

For at undgå skrivebetingelser «hvis ellers"indenfor"andet»Og for at forenkle læsningen af ​​koden blev den oprettet«Elif«. Når vi har mange betingelser, der afhænger af den foregående, for eksempel rækkevidde eller typen:

VAR1 = $ 1 hvis [[$ VAR1 = 1]]; derefter printf "1 \ n" elif [[$ VAR1 = 2]]; derefter printf "2 \ n" elif [[$ VAR1 = 3]]; derefter printf "3 \ n" ellers printf "ingen \ n" fi

I tilfælde af den sidste «Elif»Mange betingelser læses. I tilfælde af denne proces er strømlinet:

VAR1 = $ 1 sag $ VAR i 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 eller 4, det afhænger \ n" ;; *) printf "ingen \ n" ;; at C

En variabel læses, i dette tilfælde VAR1, og det kontrolleres, om den svarer til nogen af ​​tilfældene, hvis ikke, vil standardtilfældet "*" blive udført. Dobbelt semikolon svarer til «bryde«, De fortæller«tilfælde»Det skal slutte.

«Kasse »Kan også bruges som en sekvens af«if«, Til det skal du bruge« ;; & »(fortsæt) i stedet for« ;; » (hold op).

7. Sløjfer

Meget få sløjfer er kendt på ethvert programmeringssprog. I Bash er de «mens""indtil»Y«forum«. Det er allerede skrevet i bloggen om disse:

Der er to typer løkker «forum«, De, der er af typen«$ for VAR i LOQUESEA»Og hvad er der af type C«$ for ((I = 0; I <= 10; I ++))«. Den anden type sløjfer «forum»Er meget nyttige, den har 3 dele i begyndelsen af ​​sløjfen:

  • Erklæring og initiering af variabler (i dette tilfælde en hjælpevariabel "I = 0").
  • Udførelsesbetingelse (indtil jeg er mindre end eller lig med 10).
  • Forøgelse af hjælpevariablen

Efter min mening er det den mest kraftfulde løkke af alle. Et eksempel, der udskriver alle tal fra 0 til 10 inklusive:

#! / bin / bash for ((I = 0; I <= 10; I ++)); udskriv "$ I \ n" færdig

8. Funktioner

Der er nogle ting, som Bash ikke tillader os at gøre, ikke? Ved første øjekast forhindrer bash-funktioner dig i at gøre 3 ting: at erklære lokale variabler i funktioner, videregive parametre til funktioner og returnere parametre. Alt har en løsning.

Gør intet som:

#! / bin / bash VAR = 1 printc "$ VAR \ n" funktion hej () {VAR = 2 printf "$ VAR \ n"} hej printf "$ VAR \ n"

Dette udskrives på skærm 1, 2 og 2.

For at erklære lokale variabler skal du tilføje «lokale»Ved erklæring:

#! / bin / bash VAR = 1 printf "$ VAR1 \ n" funktion foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"

Dette udskriver 1, 1, 2, 1 på skærmen.

Hvordan overfører du parametre til en funktion?

#! / bin / bash # - * - KODNING: UTF-8 - * - funktion hej () {printf "Hej $ 1 \ n"}

printf "Hvad hedder du? \ n"
læs VAR1
hej $ VAR1

Hvordan returneres parametre?

#! / bin / bash # - * - KODNING: UTF-8 - * - funktion hej () {printf "Hej holita"} printf "Hvad hedder du? \ n" læs VAR1 VAR1 = $ (hej) # HER ER DET printf "$ VAR1 $ VAR2 \ n"

Som du kan se, har dette to ulemper, du kan kun returnere en parameter, som kan være en vektor 😀, og hvis du vil returnere en parameter, kan du ikke længere udskrive på skærmen fra den funktion.

Du kan finde flere ting om funktioner på [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]denne artikel fra Usemoslinux[/url].

9. Getops

En af de sidste ting, du har brug for at vide om Bash for at oprette komplekse scripts, er «getops«. Det bruges til at videregive indstillinger til scriptet uanset rækkefølgen. Den eneste ulempe er, at det kun påvirker korte muligheder:

#! / bin / bash # - * - KODNING: UTF-8 - * - VARC = 0 funktionshjælp () {printf "Hjælpemeddelelse \ n" afslut} hvis [[-z $ 1]]; hjælp derefter fi mens getopts: ha: b: c OPT; gøre sagen $ OPT i h) hjælp ;; :) Hjælp ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Hjælp ;; esac done # Hovedblok i scriptet, som # gør ting med VARA, VARB og VARC

«getopts»Læser indstillingerne en efter en, så der er behov for en løkke.

Der er to typer valgmuligheder, der kan overføres ved hjælp af «getopts":

  • Parametre kaldet flag, i dette tilfælde -c eller -h. De specificeres med det bogstav, vi vil bruge. De er som boolske variabler, «sand»(Are) eller«falsk"(De er ikke her).
  • Parametre med tilhørende argumenter, -a noget, -b noget. De er specificeret med det bogstav vi ønsker med et kolon nedenfor. Argumentet er gemt i OPTARG (dette navn kan ikke ændres).
De indledende dobbeltpunkter skal ikke vise nogen fejl.

Hvad gør dette script?

Viser hjælpemeddelelsen, når der ikke overføres nogen indstilling, når parameteren "-h" sendes, når en ugyldig parameter sendes (f.eks. "-X", gøres dette ved "\?") Eller når gyldig parameter uden argument (":"). I de øvrige tilfælde gemmer det tilstedeværelsen af ​​"-c" som en 1 i VARC, og værdierne overføres med "-a" og "-b" i VARA og VARB.


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   Elav sagde han

    MESTLIGT. Jeg siger ikke mere U_U

  2.   Miguel sagde han

    Hej, meget god artikel.
    Hej du sætter for at give tilladelser sudo + x i stedet for chmod + x

    1.    Henry sagde han

      $ sudo chmod + x script.sh
      (For at være mere præcis, hehe)

      Ah, tillykke og tak!

  3.   ildkoldt sagde han

    Meget godt indlæg, jeg lykønsker dig virkelig, fortsæt det, hilsner

  4.   Gustavo sagde han

    Og hvis du vil have scriptet til at være synligt, når det udføres, trin for trin, se f.eks. Hvordan variabler, betingelser og alt opfører sig, kan du bruge:

    sh -x script

    hilsen

  5.   Dago sagde han

    STIK af vejledning. Fremragende og meget godt forklaret.
    Tak.

  6.   Gabriel sagde han

    Fremragende indlæg om emnet 😉

  7.   Mario Guillermo Zavala Silva sagde han

    Meget interessant og vigtigt, tak for informationen ....
    SKAL !!!

  8.   Ikke fra Brooklyn sagde han

    Tak alle for dine lykønskninger, for Miguel-kommandoen, han lader mig ikke ændre posten, når den er offentliggjort. Det bliver nødt til at gøre elav forestiller jeg mig.

  9.   Adrián sagde han

    Meget godt!

    Først og fremmest ville jeg lykønske dig med indlægget, jeg fandt det let at forstå, og det hjælper virkelig med at følge retningslinjerne for at programmere godt i bash, især for folk der begynder at programmere.

    Jeg har dog fundet et par detaljer, som jeg synes, skal rettes.

    Først: i afsnit «2. STRUKTUR AF ET SCRIPT »funktionen er ikke lukket, hvilket vil medføre problemer, når den udføres i et script.
    Løsningen ville være at tilføje en bøjle lige efter kommandoen "exit".

    Andet: i afsnit «4. LÆS BRUGERINPUTEN »du bekræfter, at de parametre, som brugeren kan indtaste, går fra $ 0 til uendelig, men" bash "vil kun fortolke fra $ 0 til $ 9, da $ 10 vil være lig med $ 1 + 0.
    For at løse dette problem kan du enten bruge kommandoen "shift" til at få fat i følgende variabler. Eller angiv variablen i parenteserne "$ {10}", så bash tager værdierne sammen, ikke som $ 1 + 0.

    Uden yderligere ado, hilsner!

    1.    Ikke fra Brooklyn sagde han

      Tak for din kommentar. Det mislykkedes fuldstændigt med at forklare den korrekte brug af exit, både i scriptet og i funktionerne. Med hensyn til $ {10} har jeg aldrig testamenteret så meget, så jeg er ikke stødt på det problem, det er godt at vide, at der er en løsning på det (jeg har allerede overstreget det nye, man lærte i dag 😀).

  10.   chanio sagde han

    Mange tak for artiklen! Nogle ting, du nævner, manglede stadig afklaring. For eksempel getops.
    I den del af skærmudgange var du nødt til at nævne den kat, som du senere nævner ...
    kat <
    ***************************************
    * DENNE SKEMA ER MEGET UDTRYKLIG *
    ***************************************
    EOF

    I dit eksempel:
    kat << EOF >> test.sh
    To ting skal nævnes ... >> det er 'tilføj', det vil sige, hvis du gentager den samme kommando, har du hele scriptet i to eksemplarer ... Du skal kun bruge en ...
    kat << EOF> script.sh
    Ja, det skal også kaldes script.sh
    Så ind
    hvis [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–hjælp"]]; derefter
    hjælpe
    fi

    Jeg synes, det skal skrives ...
    hvis [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–hjælp"]]; derefter
    ...

    Der er meget mere at opdage fra BASH.
    Kunne du titlen det "GRUNDLÆGGENDE"? 🙂
    For eksempel, parameter 'testere' som -z for at se, om de er tomme, eller -f for at vide, om den findes som en fil.

    Igen, tak for din indsats.
    alberto

  11.   clow_eriol sagde han

    En meget god bash script tutorial!

  12.   OCZ sagde han

    -- KODNING: UTF-8 --

    Det er første gang, jeg har set denne linje for at indstille tegnkodning i et bash-script. Det virker mere typisk for Python end Bash. Er det virkelig nødvendigt? Jeg har søgt efter en reference på Google, men jeg kan ikke finde noget. Har du et link ved hånden, der taler om denne sag? Specifikt om linjens egnethed.

    Efter min mening skal du kun gemme tekstfilen som sådan (uden stykliste) og have visse miljøvariabler (LANG og LC_ *) korrekt indstillet for at skrive scripts i Bash ved hjælp af UTF-8.
    Derefter er det naturligvis nødvendigt, at de udførte kommandoer er forberedt på andre kodninger end ASCII. For eksempel, hvis vi vil gå med store bogstaver, ser det ikke ud til at fungere:
    «Echo áéíóú | tr az AZ »
    o:
    «Echo áéíóú | tr [: nederste:] [: øverste:] »
    og det er bedre at bruge:
    «Echo áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Ikke fra Brooklyn sagde han
    2.    borriquito som dig sagde han

      Nogen korrigerer mig, men den kodende linje (# -- KODNING: UTF-8 --) Det har intet at gøre med bash eller shell: det er en kommentarlinje (starter med #) og tjener til at fortælle redaktøren, at vi bruger til at skrive scriptet (vim, emacs ...) kodningen af ​​filen.

      Faktisk ser bash ikke en sådan linje, fordi det er en kommentarlinje.

  13.   JORGE-1987 sagde han

    Fremragende tutorial, da Sysadmin kender Scripting i Bash er vigtig, er det nyttigt for alt.

    Meget meget god!

    Greetings!

  14.   Edward Cuomo sagde han

    Hvis det er nyttigt for nogen, er der flere anvendelser og eksempler til at oprette dine egne scripts: https://github.com/reduardo7/hsabx

  15.   Lito Black sagde han

    Meget godt. Nye ting at tilføje til mine scripts. Encodig og printf ting havde det ikke.
    Tak skal du have!!!

  16.   xxxtonixxx sagde han

    Sååå god artikel! Jeg holder denne til favoritter, det ville være rart at rette op på, hvad der er galt, og endda udvide det med mere indhold. En bifald for al denne info !!!!