if
then
fi
structuur. Toevoegen elif
trefwoorden voor aanvullende voorwaardelijke uitdrukkingen, of de else
trefwoord om een allesomvattende codesectie te definiëren die wordt uitgevoerd als er geen eerdere voorwaardelijke clausule is uitgevoerd.Alle niet-triviale Bash-scripts moeten beslissingen nemen. De Bash if-instructie laat je Linux-script vragen stellen en, afhankelijk van het antwoord, verschillende secties code uitvoeren. Hier is hoe ze werken.
Wat is voorwaardelijke uitvoering?
In alle Bash-scripts, behalve de meest triviale, is het meestal nodig dat de uitvoeringsstroom een ander pad door het script volgt, afhankelijk van de uitkomst van een beslissing. Dit wordt voorwaardelijke uitvoering genoemd.
Een manier om te beslissen welke tak van uitvoering moet worden genomen, is door een if
stelling. Je hoort het misschien if
uitspraken genoemd if then
verklaringen, of if then else
verklaringen. Het zijn verschillende namen voor hetzelfde.
De if
verklaring zegt dat als iets waar is, doe het dan dit. Maar als het iets niet waar is, doe het dan Dat in plaats van. Het “iets” kan veel dingen zijn, zoals de waarde van een variabele, de aanwezigheid van een bestand, of twee strings overeenkomen.
Voorwaardelijke uitvoering is essentieel voor elk zinvol script. Zonder dat ben je erg beperkt in wat je je script kunt laten doen. Tenzij het zinvolle beslissingen kan nemen, zult u niet in staat zijn om echte problemen aan te pakken en werkbare oplossingen te produceren.
De if
verklaring is waarschijnlijk de meest gebruikte manier om voorwaardelijke uitvoering te verkrijgen. Hier leest u hoe u het kunt gebruiken in Bash-scripts.
Een eenvoudig voorbeeld van een If-verklaring
Dit is de canonieke vorm van de eenvoudigste if
stelling:
if [ this-condition-is-true ] then execute-these-statements fi
Als de voorwaarde in de tekst wordt omgezet in waar, worden de scriptregels in het then
clausule worden uitgevoerd. Als u scripts doorzoekt die door anderen zijn geschreven, ziet u mogelijk de if
verklaring zo geschreven:
if [ this-condition-is-true ]; then execute-these-statements fi
Enkele aandachtspunten:
- De
if
verklaring wordt schriftelijk afgeslotenfi
. - Er moet een ruimte zijn na de eerste beugel ”
[
” and before the second bracket ”]
” van de voorwaardelijke test. - Als je de
then
trefwoord op dezelfde regel als de voorwaardelijke test, zorg ervoor dat u een puntkomma gebruikt ”;
” na de proef.
We kunnen een optioneel toevoegen else
clausule om code uit te voeren als de conditietest onwaar blijkt te zijn. De else
clausule heeft geen a nodig then
trefwoord.
if [ this-condition-is-true ] then execute-these-statements else execute-these-statements-instead fi
Dit script toont een eenvoudig voorbeeld van een if
verklaring die gebruik maakt van een else
clausule. De voorwaardelijke test controleert of de klant ouder is dan of gelijk is aan 21 jaar. Als dat zo is, kan de klant het pand betreden en de then
clausule wordt uitgevoerd. Als ze niet oud genoeg zijn, de else
clausule wordt uitgevoerd en ze zijn niet toegestaan.
#!/bin/bash customer_age=25 if [ $customer_age -ge 21 ] then echo "Come on in." else echo "You can't come in." fi
Kopieer het script van bovenaf naar een editor, sla het op als een bestand met de naam “if-age.sh” en gebruik de chmod
commando om het uitvoerbaar te maken. U moet dat doen met elk van de scripts die we bespreken.
chmod +x if-age.sh
Laten we ons script uitvoeren.
./if-age.sh
Nu gaan we het bestand bewerken en een leeftijd van minder dan 21 jaar gebruiken.
customer_age=18
Breng die wijziging aan in uw script en sla uw wijzigingen op. Als we het nu uitvoeren, retourneert de voorwaarde false en wordt de else-clausule uitgevoerd.
./if-age.sh
De elif-clausule
De elif
clausule voegt extra voorwaardelijke tests toe. Je kunt er zoveel hebben elif
clausules zoals u wilt. Ze worden achtereenvolgens geëvalueerd totdat een ervan waar blijkt te zijn. Als geen van de elif
voorwaardelijke tests blijken waar te zijn, de else
clausule, indien aanwezig, wordt uitgevoerd.
Dit script vraagt om een getal en vertelt je vervolgens of het even of oneven is. Nul is een even getal, dus we hoeven niets te testen.
Alle andere getallen worden getest door de modulo van een deling door twee te vinden. In ons geval is de modulo het gebroken deel van het resultaat van een deling door twee. Als er geen breukdeel is, is het getal precies door twee deelbaar. Daarom is het een even getal.
#!/bin/bash echo -n "Enter a number: " read number if [ $number -eq 0 ] then echo "You entered zero. Zero is an even number." elif [ $(($number % 2)) -eq 0 ] then echo "You entered $number. It is an even number." else echo "You entered $number. It is an odd number." fi
Om dit script uit te voeren, kopieert u het naar een editor en slaat u het op als “if-even.sh”, en gebruikt u vervolgens chmod om het uitvoerbaar te maken.
Laten we het script een paar keer uitvoeren en de uitvoer controleren.
./if-even.sh
Dat werkt allemaal prima.
Verschillende vormen van voorwaardelijke test
De beugels ” []
” die we voor onze voorwaardelijke tests hebben gebruikt, is een verkorte manier om de test
programma. Daarom, alle vergelijkingen en tests die test
steunen zijn beschikbaar voor uw if
stelling.
Dit zijn er maar een paar:
- ! uitdrukking: Waar als de uitdrukking onwaar is.
- -n tekenreeks: Waar als de lengte van de tekenreeks groter is dan nul.
- -z tekenreeks: Waar als de lengte van de tekenreeks nul is. Dat wil zeggen, het is een lege string.
- tekenreeks1 = tekenreeks2: True als string1 hetzelfde is als string2.
- tekenreeks1 != tekenreeks2: True als string1 niet hetzelfde is als string2.
- geheel getal1 -eq geheel getal2: Waar als geheel getal1 numeriek gelijk is aan geheel getal2
- geheel getal1 -qt geheel getal2: Waar als geheel getal1 numeriek groter is dan geheel getal2
- geheel getal1 -lt geheel getal2: Waar als geheel getal1 numeriek kleiner is dan geheel getal2
- -d map: waar als de map bestaat.
- -e bestand: waar als het bestand bestaat.
- -s bestand: Waar als het bestand bestaat met een grootte van meer dan nul.
- -r bestand: Waar als het bestand bestaat en de leesmachtiging is ingesteld.
- -w-bestand: Waar als het bestand bestaat en de schrijfrechten zijn ingesteld.
- -x bestand: Waar als het bestand bestaat en de uitvoermachtiging is ingesteld.
In de tabel kunnen “bestand” en “map” mappaden bevatten, relatief of absoluut.
Het gelijkteken “=
” en de gelijkheidstest -eq
Zijn niet hetzelfde. Het gelijkteken voert a uit karakter voor karakter tekst vergelijking. De gelijkheidstest voert een numeriek vergelijking.
We kunnen dit zien door de test
programma op de opdrachtregel.
test "this string" = "this string"
test "this string" = "that string"
test 1 = 001
test 1 -eq 001
In elk geval gebruiken we de echo
opdracht om de retourcode van de laatste opdracht af te drukken. Nul betekent waar, één betekent onwaar.
Het gelijkteken gebruiken ” =
” geeft ons een onjuist antwoord door 1 te vergelijken met 001. Dat klopt, want het zijn twee verschillende tekenreeksen. Numeriek ze hebben dezelfde waarde – één – dus de -eq
operator retourneert een waar antwoord.
Als u jokertekens wilt gebruiken in uw voorwaardelijke test, gebruikt u de dubbele haak ” [[ ]]
” syntaxis.
#!/bin/bash if [[ $USER == *ve ]] then echo "Hello $USER" else echo "$USER does not end in 've'" fi
Dit script controleert de accountnaam van de huidige gebruiker. Als het eindigt op “ve
“, drukt het de gebruikersnaam af. Als het niet eindigt in ” ve
“, zegt het script je, en eindigt.
./if-wild.sh
Geneste If-verklaringen
Je kunt een if
verklaring in een ander if
stelling.
Dit is volkomen acceptabel, maar nestelend if
verklaringen zorgen voor code die minder gemakkelijk te lezen en moeilijker te onderhouden is. Als je merkt dat je meer dan twee of drie niveaus nestelt if
statements, moet u waarschijnlijk de logica van uw script reorganiseren.
Hier is een script dat de dag als een getal krijgt, van één tot zeven. Eén is maandag, zeven is zondag.
Het vertelt ons de openingstijden van een winkel. Als het een doordeweekse dag of zaterdag is, meldt het dat de winkel open is. Als het een zondag is, meldt het dat de winkel gesloten is.
Als de winkel open is, is de geneste if
verklaring doet een tweede test. Als de dag woensdag is, vertelt het ons dat het alleen ’s morgens open is.
#!/bin/bash # get the day as a number 1..7 day=$(date +"%u") if [ $day -le 6 ] then ## the shop is open if [ $day -eq 3 ] then # Wednesday is half-day echo "On Wednesdays we open in the morning only." else # regular week days and Saturday echo "We're open all day." fi else # not open on Sundays echo "It's Sunday, we're closed." fi
Kopieer dit script naar een editor, sla het op als een bestand met de naam “if-shop.sh” en maak het uitvoerbaar met behulp van de chmod
commando.
We hebben het script één keer uitgevoerd en vervolgens de klok van de computer gewijzigd in een woensdag en het script opnieuw uitgevoerd. We veranderden toen de dag in een zondag en liepen het nog een keer.
./if-shop.sh
./if-shop.sh
./if-shop.sh
Het geval Voor als
Voorwaardelijke uitvoering is wat kracht geeft aan programmeren en scripten, en de nederigen if
statement is misschien wel de meest gebruikte manier om het uitvoeringspad binnen code te veranderen. Maar dat betekent niet dat het altijd het antwoord is.
Goede code schrijven betekent weten welke opties je hebt en welke je het beste kunt gebruiken om aan een bepaalde eis te voldoen. De if
statement is geweldig, maar laat het niet het enige hulpmiddel in je tas zijn. Bekijk vooral de case
verklaring die in sommige scenario’s een oplossing kan zijn.