0. Indeks
- Ting der sker for de fleste mennesker
- Struktur af et script
- Udskriv på skærmen
- Læs brugerINPUT
- Beregninger i bash
- Betingelser
- Sløjfer
- funktioner
- 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
BIN = "mappe hvor vi har scripts" PATH = "$ BIN $ PATH"
2. Struktur af et script
- hoved
- Definition af globale variabler
- hjælpe
- funktioner
- 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.
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.
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"
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))
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:
- Programmering i Bash: del 1
- Bash: hvis, så, ellers betingelser
- Kontroller, om en fil eller mappe findes eller ej, og mere med en if-loop
- Programmering i Bash: del 2
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
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.
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.
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).
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.
MESTLIGT. Jeg siger ikke mere U_U
Hej, meget god artikel.
Hej du sætter for at give tilladelser sudo + x i stedet for chmod + x
$ sudo chmod + x script.sh
(For at være mere præcis, hehe)
Ah, tillykke og tak!
Meget godt indlæg, jeg lykønsker dig virkelig, fortsæt det, hilsner
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
STIK af vejledning. Fremragende og meget godt forklaret.
Tak.
Fremragende indlæg om emnet 😉
Meget interessant og vigtigt, tak for informationen ....
SKAL !!!
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.
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!
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 😀).
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
En meget god bash script tutorial!
-- 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)}' ».
Omkring "kodning»Er nævnt i denne blog før:
Bash: hvordan man laver et script eksekverbart
Post installationsværktøjsscript
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.
Fremragende tutorial, da Sysadmin kender Scripting i Bash er vigtig, er det nyttigt for alt.
Meget meget god!
Greetings!
Hvis det er nyttigt for nogen, er der flere anvendelser og eksempler til at oprette dine egne scripts: https://github.com/reduardo7/hsabx
Meget godt. Nye ting at tilføje til mine scripts. Encodig og printf ting havde det ikke.
Tak skal du have!!!
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 !!!!