Basis van shellscripts

Zet reeksen commando's die je steeds opnieuw typt om in Bash-scripts. Begin elk script met een shebangregel en maak het uitvoerbaar. Sla waarden op in variabelen, scherm ze veilig af en vang commando-uitvoer op. Geef met afsluitcodes aan of een commando is geslaagd of mislukt en test bestanden, tekst en getallen om te bepalen wat er daarna gebeurt. Herhaal taken met for-, while- en until-lussen en geef argumenten door zodat één script veel situaties aankan. Plan ten slotte je scripts om ze automatisch uit te voeren met cron of systemd-timers en controleer of elke uitvoering is geslaagd.

BeginnerLes 4 van 7 in Cursus Linux: commandoregel, shellscripts, gebruikers en services

Wat je leert

  1. Zet een reeks commando's die je steeds opnieuw typt in een scriptbestand, begin het met de juiste interpreterregel en voer het vanuit elke directory uit.
    • Zet terugkerende commando's in een scriptbestand
      Schrijf commando's op volgorde in een bestand met platte tekst, voeg commentaar toe en begin het bestand met een shebangregel die Bash als interpreter aanwijst.
    • Voer een script uit en kies waar je het opslaat
      Maak een script uitvoerbaar, voer het uit via een pad of een interpreter, plaats het in een directory op PATH en weet wanneer een script je huidige shell kan wijzigen.
  2. Bewaar tekst, getallen en commando-uitvoer in variabelen, lees invoer van de gebruiker en gebruik afscherming zodat spaties en speciale tekens ongewijzigd bij commando's aankomen.
    • Maak variabelen, lees hun waarden en exporteer ze
      Ken waarden toe aan shellvariabelen en gebruik ze, kies goede namen, lees invoer van de gebruiker en geef variabelen door aan de programma's die een script start.
    • Scherm woorden, variabelen en speciale tekens af
      Kies tussen enkele aanhalingstekens, dubbele aanhalingstekens en backslashes en scherm elke variabele-expansie af zodat spaties en jokertekens in waarden een commando niet kunnen verstoren.
    • Vang commando-uitvoer op en reken met gehele getallen
      Sla de uitvoer van een commando op met commandosubstitutie en reken met gehele getallen, bijvoorbeeld om bestandsnamen met een datum te maken en tellers bij te houden.
  3. Lees de afsluitstatus van commando's en scripts uit en stel die in, koppel vervolgcommando's aan succes of mislukking en spoor fouten op en stop ze voordat ze schade veroorzaken.
    • Lees afsluitcodes uit, stel ze in en koppel er vervolgcommando's aan
      Gebruik de afsluitstatus die elk commando teruggeeft, beëindig een script met een betekenisvolle code en voer commando's alleen uit als een eerder commando is geslaagd of mislukt.
    • Spoor fouten op en stop een script veilig
      Controleer en traceer een script om fouten te vinden, stuur foutmeldingen naar standaardfoutuitvoer en laat een script stoppen bij mislukte commando's, niet-ingestelde variabelen en mislukte pijplijnen.
  4. Test bestanden, tekst en getallen, kies met if en case wat je doet en herhaal commando's voor lijsten, bestanden en regels met for-, while- en until-lussen.
    • Test bestanden, tekenreeksen en getallen
      Schrijf voorwaarden met test, [ ] en [[ ]] die controleren of bestanden bestaan, tekst en gehele getallen vergelijken en combineer of ontken die voorwaarden.
    • Kies acties met if, elif, else en case
      Voer met if, elif en else verschillende commando's uit afhankelijk van een voorwaarde en vergelijk met case één waarde met meerdere patronen.
    • Herhaal commando's voor lijsten en bestanden met for
      Doorloop een lijst met woorden, de bestanden die overeenkomen met een patroon, een getallenbereik of de argumenten van een script en verwerk bestandsnamen met spaties.
    • Herhaal commando's totdat een voorwaarde verandert met while en until
      Voer commando's uit zolang een voorwaarde slaagt of totdat die slaagt, lees een bestand regel voor regel en bestuur lussen met break, continue en sleep.
  5. Geef een script zijn invoer op de commandoregel, lees de argumenten binnen het script, controleer ze en geef standaardwaarden op zodat hetzelfde script voor veel situaties werkt.
    • Lees positionele parameters en het aantal argumenten uit
      Gebruik $0, $1 tot en met $9, ${10}, $# en "$@" om de woorden te lezen die na de naam van een script zijn opgegeven, en gebruik shift om ze te doorlopen.
    • Controleer argumenten, toon een gebruiksinstructie en stel standaardwaarden in
      Controleer het aantal en de soort argumenten, toon een gebruiksinstructie en sluit af met een foutcode, gebruik standaardwaarden en verwerk eenvoudige opties.
  6. Voer scripts met cron of systemd-timers op vaste tijden of met vaste tussenpozen uit zonder aangemeld te zijn, en controleer of de geplande uitvoeringen plaatsvinden en slagen.
    • Plan taken met cron
      Schrijf crontab-vermeldingen met de vijf tijdvelden, bewerk en toon ze met crontab en bereid scripts voor op de minimale omgeving van cron.
    • Plan taken met systemd-timers
      Koppel een service-unit aan een timerunit, schrijf planningen op basis van de kalender en tussenpozen, schakel de timer in en controleer de volgende uitvoering en de logboeken.

Shellscripts: uitleg

6 hoofdstukken

1

Schrijf je eerste Bash-scripts en voer ze uit

Een paar commando's zijn gemakkelijker te herhalen als ze samen in een script staan. Je geeft het bestand een Bash-interpreter, houdt de instructies leesbaar en kiest hoe je het start. Bestandsrechten, zoekpaden voor commando's en kindshells verklaren enkele veelvoorkomende verrassingen: waarom een script met bash werkt maar met ./ mislukt, waarom de naam niet wordt gevonden en waarom wijzigingen van directory in het script je terminal niet verplaatsen.

1.1 Zet terugkerende commando's in een scriptbestand

Een shellscript bewaart een reeks commando's in een bestand met platte tekst. Bash leest de commando's op volgorde, net zoals het commando's leest die je bij een prompt invoert. Een script kan een taak herhalen zonder dat iemand elke stap typt en geeft je één plek om die taak te corrigeren of te verbeteren.

Zet de interpreter op de eerste regel

De shebang vertelt Linux welk programma een uitvoerbaar script moet lezen. Begin een Bash-script met #!/bin/bash. De #! moet uit de eerste twee tekens van het bestand bestaan: er mogen geen spaties of lege regel voor staan. Bash is de Bourne Again Shell. Die wordt op Linux veel gebruikt als interactieve shell en leest ook scriptbestanden.

Een interpreter is een programma dat een andere taal leest en uitvoert. Via hetzelfde mechanisme kiest #!/usr/bin/python3 voor Python en #!/usr/bin/awk -f voor awk. De rest van een Bash-script moet shellcommando's bevatten die Bash begrijpt.

Maak backup-notes.sh in een editor voor platte tekst zoals nano of vi:

#!/bin/bash
# Keep a copy of the notes and show the backup folder.
mkdir -p ~/backup
cp ~/notes.txt ~/backup/
ls -l ~/backup

Bash maakt eerst de bestemmingsdirectory, kopieert daarna de notities en toont vervolgens de inhoud van de bestemming. mkdir -p slaagt ook als de directory al bestaat, zodat een latere uitvoering die kan hergebruiken. Het bronbestand ~/notes.txt moet bestaan om het kopiëren te laten werken. Door de commando's op te slaan maak je dat bronbestand niet aan.

Maak het bestand leesbaar voor mensen

De tweede regel is commentaar. Buiten afgeschermde tekst begint # aan het begin van een woord een commentaarregel; Bash negeert de rest van die regel. Schrijf commentaar over het doel van een stap, bijvoorbeeld waarom een back-up moet worden bewaard. Lege regels en inspringing maken groepen commando's beter zichtbaar. Laat de inspringing consistent blijven als je voorwaarden en lussen toevoegt.

De extensie .sh helpt een lezer een shellscript te herkennen. Linux vereist die extensie niet en door die toe te voegen kies je geen Bash en verleen je geen uitvoerrecht. Een bestand met de naam backup-notes kan dezelfde commando's uitvoeren.

Stem de shell af op de taal
Eerste regelHoe de interpreter wordt gekozen
#!/bin/bashGebruikt Bash op het vaste pad /bin/bash.
#!/usr/bin/env bashGebruikt env om Bash via PATH te vinden.
#!/bin/shGebruikt sh van het systeem, wat een andere shell kan zijn.

Op Debian en Ubuntu kiest /bin/sh normaal gesproken dash. Bash-functies zoals [[ ... ]] werken daarin niet. Een Bash-script heeft een Bash-interpreter nodig, ook als eenvoudige commando's toevallig onder beide shells werken. Een bestand something.sh noemen lost een niet-passende shebang niet op.

Herken een probleem met regeleinden

Windows-editors kunnen vóór elk nieuweregelteken een carriage-returnteken opslaan. Op Linux kan dat onzichtbare teken deel worden van het shebangpad. Een fout zoals /bin/bash^M: bad interpreter: No such file or directory wijst op dit probleem, ook al bestaat /bin/bash.

Zet het bestand om naar Unix-regeleinden met dos2unix backup-notes.sh en sla toekomstige scripts daarna in de editor op met Unix-regeleinden. De commando's in het bestand kunnen correct zijn terwijl het extra teken voorkomt dat Linux hun interpreter start.

Belangrijkste punten

  • Een script is platte tekst met commando's die op volgorde worden uitgevoerd.
  • De shebang moet helemaal aan het begin van het bestand staan en de juiste interpreter aanwijzen.
  • Gebruik commentaar en inspringing om het doel en de structuur duidelijk te maken.
  • Een .sh-extensie is een conventie; die kiest geen shell.
  • Unix-regeleinden voorkomen dat een verborgen carriage-returnteken de shebang onbruikbaar maakt.

1.2 Voer een script uit en kies waar je het opslaat

Bash kan een script rechtstreeks lezen of het script kan als programma worden gestart. Deze manieren verschillen in de rechten die ze nodig hebben en in de keuze van de interpreter. Het pad dat je typt, bepaalt ook of de shell een commando zoekt of één specifiek bestand gebruikt.

Twee manieren om hetzelfde bestand te starten
bash backup-notes.sh
chmod u+x backup-notes.sh
./backup-notes.sh

Het eerste commando start Bash en vraagt die het bestand te lezen. Het script heeft leesrecht nodig; de eigen uitvoerbit is niet vereist. Bash behandelt de shebang als commentaar omdat de interpreter al is gekozen.

Het tweede commando voegt uitvoerrecht toe voor de eigenaar van het bestand. In een rechtenreeks zoals -rwxr--r-- betekent de x van de eigenaar dat het bestand uitvoerbaar is. Het derde commando voert het bestand uit als programma en gebruikt de shebang. Ook chmod +x wordt veel gebruikt; zonder genoemde rechtenklasse beperkt de umask welke klassen uitvoerrecht krijgen. chmod u+x richt zich expliciet op de eigenaar.

Als ./backup-notes.sh “Permission denied” meldt, controleer dan het uitvoerrecht en de toegang tot het pad. Als bash backup-notes.sh werkt, betekent dat niet dat de rechten voor directe uitvoering in orde zijn.

Begrijp hoe commando's worden gezocht

./ betekent de huidige directory. Als een commando een schuine streep bevat, volgt Bash dat pad. Als je een naam zonder schuine streep typt, doorzoekt Bash de directory's in PATH. De huidige directory ontbreekt normaal gesproken in die lijst, dus in de directory van een script staan is niet genoeg om het met alleen de naam uit te voeren.

echo "$PATH"
command -v backup-notes.sh
type backup-notes.sh

PATH is een lijst gescheiden door dubbele punten, zoals /home/sam/.local/bin:/usr/local/bin:/usr/bin:/bin. Het eerste overeenkomende uitvoerbare bestand wordt gebruikt. De laatste twee commando's helpen bepalen wat bij een naam wordt uitgevoerd, ook als er ergens anders op PATH een oudere kopie staat.

Om een persoonlijk script met zijn naam beschikbaar te maken, plaats je het in een directory op je PATH. Veel distributies voegen ~/bin of ~/.local/bin bij het aanmelden toe als die directory bestaat; controleer je eigen PATH. /usr/local/bin is een gebruikelijke locatie voor scripts die gebruikers delen en je hebt beheerdersrechten nodig om erin te schrijven.

Kies een kindshell of de huidige shell

Als je ./settings.sh of bash settings.sh uitvoert, start een Bash-kindproces. De variabelen en directorywijzigingen ervan horen bij dat kindproces. Een script met cd /var/log verplaatst de terminal die het startte niet. Als het eindigt, sta je nog steeds in de oorspronkelijke directory van de terminal.

Inlezen in de huidige shell (sourcing) leest commando's in de huidige shell:

source ./settings.sh
# Equivalent short form:
. ./settings.sh

Gebruik dit voor een instellingenbestand dat bedoeld is om je sessie te wijzigen. Inlezen vereist leesrecht, geen uitvoerrecht, en een shebang start geen afzonderlijke interpreter. Als je een Bash-instellingenbestand inleest, ga je er dus van uit dat de huidige shell Bash-syntaxis begrijpt.

Lees het resultaat van een uitvoering

Direct nadat een script eindigt, toont echo $? de afsluitstatus. Tenzij het script exit met een gekozen code gebruikt, komt de status van het laatste commando. Een geslaagde laatste bestandslijst kan daardoor een eerder mislukte kopieeractie verbergen; met foutcontroles verderop kan het script het werkelijke resultaat van de taak melden.

Belangrijkste punten

  • bash file leest een script met Bash; ./file vereist uitvoerrecht en gebruikt de shebang.
  • PATH wordt alleen doorzocht voor commandonamen zonder schuine streep.
  • Controleer een commandonaam met command -v of type.
  • Uitvoering start een kindshell; inlezen kan de huidige shell wijzigen.
2

Sla waarden op in variabelen en scherm ze veilig af

Met variabelen werken dezelfde commando's met wisselende paden, namen en aantallen. Afscherming houdt die waarden intact terwijl Bash een commandoregel opbouwt, zodat een spatie in een naam deel van de naam blijft. Je leest invoer, geeft waarden door aan kindprogramma's, vangt commando-uitvoer op en rekent met gehele getallen. Deze onderdelen werken samen als een script een bestandsnaam met een datum maakt of een doorlopende telling bijhoudt.

2.1 Maak variabelen, lees hun waarden en exporteer ze

Een variabele geeft een waarde een naam zodat hetzelfde script die kan hergebruiken. Bash-variabelen bevatten normaal gesproken tekst, ook als die tekst op een getal lijkt. Je kent de waarde één keer toe en expandeert de naam overal waar een commando die waarde nodig heeft.

Ken waarden toe zonder spaties
city=Lisbon
greeting="Good morning"
echo "$greeting from $city"

De uitvoer is “Good morning from Lisbon”. Er staan geen spaties rond de = van de toekenning. In city = Lisbon behandelt Bash city als een commando en de andere woorden als argumenten. Aanhalingstekens rond "Good morning" houden beide woorden in één waarde.

Gebruik letters, cijfers en underscores in variabelenamen, met een letter of underscore vooraan. Namen zijn hoofdlettergevoelig: file, File en FILE zijn verschillend. Kies namen met kleine letters zoals backup_dir voor waarden die bij je script horen. Zo voorkom je dat je omgevingsvariabelen zoals PATH of HOME vervangt. Als je PATH=/data instelt, verandert het zoeken naar commando's en worden gewone commando's mogelijk niet meer gevonden.

Geef aan waar een naam eindigt

Een dollarteken leidt een expansie in. Accolades geven de grens aan als er direct meer tekst volgt:

file=report
echo "${file}_old"

Dit toont “report_old”. Bij "$file_old" zoekt Bash een variabele met de naam file_old, niet file gevolgd door _old. Zonder set -u expandeert een niet-ingestelde naam naar lege tekst. Een spelfout kan daardoor zonder directe foutmelding een leeg pad of een lege melding opleveren.

Een waarde zoals in count=5 slaat de tekst “5” op. Tekst naast een expansie toevoegen voert geen berekening uit: echo "$count+1" toont “5+1”. Bij rekenkundige expansie krijgen getallen een andere rol als berekeningen nodig zijn.

Lees een invoerregel
read -r -p "Your name: " name
echo "Hello, $name"

read slaat de ingevoerde regel op in name. -p geeft de prompt op en -r behoudt backslashes. Bij de invoer “Lee Kim” is de begroeting “Hello, Lee Kim”. Een script dat zonder aanwezige persoon draait, heeft invoer uit argumenten, bestanden of standaardwaarden nodig; een prompt kan een ontbrekende waarde niet betrouwbaar leveren.

Exporteer waarden voor kindprogramma's

Een gewone shellvariabele hoort bij de shell waarin die is ingesteld. Met exporteren markeer je de variabele voor opname in de omgeving die wordt gekopieerd naar programma's die die shell start:

export BACKUP_DIR=/mnt/usb
bash backup-notes.sh

Het Bash-kindproces kan nu BACKUP_DIR lezen. Als dat kindproces een andere waarde toekent, behoudt het ouderproces zijn eigen waarde. Overerving van de omgeving gaat van ouder naar kind; latere wijzigingen worden niet teruggestuurd.

NaamGebruikelijke betekenis
HOMEHomedirectory
USERGebruikersnaam
PWDHuidige werkdirectory
PATHDirectory's waarin naar commandonamen wordt gezocht

env of printenv toont omgevingsvariabelen. unset name verwijdert de variabele met de naam name; het kent geen lege tekenreeks toe. Bij normale expansie kunnen beide leeg lijken, maar een controle op niet-ingestelde variabelen kan een ontbrekende variabele van een ingestelde onderscheiden.

Belangrijkste punten

  • Toekenningen gebruiken name=value zonder spaties rond =.
  • Variabelenamen zijn hoofdlettergevoelig; gebruik namen met kleine letters voor je eigen waarden.
  • ${name} markeert het einde van een variabelenaam vóór aansluitende tekst.
  • read -r leest invoer en behoudt backslashes.
  • Geëxporteerde waarden worden naar kindprocessen gekopieerd, nooit terug naar een ouderproces.
  • unset verwijdert een variabele.

2.2 Scherm woorden, variabelen en speciale tekens af

Bash leest een commando voordat het programma zijn argumenten ontvangt. Spaties scheiden woorden en tekens zoals *, ?, $, ;, &, |, < en > hebben speciale functies. Afscherming bepaalt welke van die functies actief blijven.

Kies wat mag expanderen
VormWat Bash doet
'fixed text'Houdt alles ertussen letterlijk.
"text with $name"Behoudt spaties en jokertekens, maar expandeert variabelen, commando-uitvoer en rekenkundige expressies.
\*Behandelt het volgende teken buiten aanhalingstekens letterlijk.

Vergelijk met HOME=/home/sam:

echo 'Home: $HOME *'
echo "Home: \$HOME *"

De eerste toont “Home: $HOME *”. De tweede toont “Home: /home/sam *”. Het sterretje blijft in beide gevallen letterlijk, maar alleen dubbele aanhalingstekens laten de variabele expanderen. Een enkel aanhalingsteken kan niet rechtstreeks binnen een tekenreeks tussen enkele aanhalingstekens worden geplaatst.

Binnen dubbele aanhalingstekens kunnen backslashes een dollarteken, backtick, dubbel aanhalingsteken of backslash afschermen. Zo toont echo "Price: \$5" de tekst “Price: $5”. Buiten aanhalingstekens toont echo 5 \* 3 de tekst “5 * 3” en maakt touch my\ file.txt één bestand met een spatie in de naam.

Volg een niet-afgeschermde waarde door Bash
file="my report.txt"
cp $file backup/

Eerst expandeert Bash de variabele. Daarna verdeelt woordsplitsing de waarde bij spaties, tabs en nieuweregeltekens. Het commando ontvangt my, report.txt en backup/ als afzonderlijke argumenten. Het probeert twee bronbestanden te kopiëren in plaats van het ene bedoelde bestand.

Als een resulterend woord jokertekens bevat, vervangt bestandsnaamexpansie het daarna door overeenkomende bestandsnamen. Een opgeslagen waarde van *.txt kan meerdere bestandsargumenten worden als die zonder aanhalingstekens wordt geëxpandeerd. Deze extra stappen vinden plaats voordat cp start; het programma kan je bedoelde groepering niet herstellen.

cp "$file" backup/

Nu blijft de geëxpandeerde waarde één argument, “my report.txt”. Bash verwijdert de aanhalingstekens zelf; het zijn instructies voor de verwerking, geen onderdeel van het pad dat aan cp wordt doorgegeven. Zet variabele-expansies en commandosubstituties tussen dubbele aanhalingstekens wanneer hun volledige waarde bij elkaar moet blijven.

Behoud een lege waarde

Afscherming is ook belangrijk als een waarde leeg is. In [ $answer = yes ] verdwijnt een lege answer, waardoor een ongeldige test overblijft. [ "$answer" = yes ] geeft een lege tekenreeks door als één argument, zodat de test geldig en onwaar is.

Dezelfde groeperingsregel geldt voor letterlijke woorden. mkdir new folder maakt twee directory's, terwijl mkdir "new folder" er één maakt. Een volledig pad afschermen is nuttig, of de spatie nu rechtstreeks is getypt of uit een variabele komt.

Combineer letterlijke en geëxpandeerde tekst

Aangrenzende afgeschermde delen zonder spatie ertussen vormen één woord. Met price=8 toont echo 'Price: $'"$price" de tekst “Price: $8”. Het vaste deel staat tussen enkele aanhalingstekens en het veranderlijke deel tussen dubbele. Ook een zoekpatroon kun je vast houden: grep 'cost: \$[0-9]' prices.txt geeft het patroon zonder shellexpansie door, zodat grep het patroon kan interpreteren.

Belangrijkste punten

  • Enkele aanhalingstekens houden tekst letterlijk; dubbele aanhalingstekens staan expansies toe en houden waarden bij elkaar.
  • Niet-afgeschermde expansies ondergaan eerst woordsplitsing en daarna bestandsnaamexpansie.
  • Aanhalingstekens behouden een lege waarde als argument.
  • Een backslash kan één speciaal teken letterlijk maken.
  • Aangrenzende afgeschermde delen vormen één woord als er geen spatie tussen staat.

2.3 Vang commando-uitvoer op en reken met gehele getallen

Commando's leveren vaak een waarde op die een andere stap nodig heeft. Bash kan die uitvoer opvangen, in tekst plaatsen of in een berekening gebruiken. Commandosubstitutie en rekenkundige expansie gebruiken vergelijkbare leestekens, maar doen iets anders.

Vang standaarduitvoer op
today=$(date +%F)
cp notes.txt "notes-${today}.txt"

$(...) voert een commando uit en vervangt de substitutie door de standaarduitvoer ervan. Op 2026-10-22 bevat today “2026-10-22” en heet de kopie notes-2026-10-22.txt. Een datum in de volgorde jaar-maand-dag houdt bestandsnamen bij sortering op naam in datumvolgorde. Je kunt de substitutie ook rechtstreeks in de naam zetten: "notes-$(date +%F).txt".

Nieuweregeltekens aan het einde worden uit opgevangen uitvoer verwijderd. De oudere vorm met backticks vangt ook uitvoer op, maar $(...) is gemakkelijker te lezen en te nesten. Scherm een substitutie die als commandoargument wordt gebruikt af, zoals "$(date +%F)", om het resultaat bij elkaar te houden.

Commandosubstitutie vangt alleen standaarduitvoer op. Fouten die naar standaardfoutuitvoer worden gestuurd, gaan nog steeds naar hun gebruikelijke bestemming. result=$(some_command 2>&1) combineert beide stromen binnen de opgevangen uitvoer als het script dat nodig heeft. Als je fouten mengt met een waarde die een getal moet bevatten, mislukken latere berekeningen.

Vang een telling op zonder bestandsnaam
lines=$(wc -l < access.log)
echo "Lines: $lines"

Als het bestand 342 nieuweregeltekens bevat, levert wc de telling 342. Door het bestand naar wc om te leiden bevat de uitvoer alleen de telling; wc -l access.log toont ook de bestandsnaam. Een resultaat dat op een getal lijkt, kun je dan hergebruiken, mits het commando is geslaagd.

Reken met gehele getallen

$(( ... )) voert rekenkundige expansie uit:

echo "$(( 17 / 5 ))"
echo "$(( 17 % 5 ))"

De resultaten zijn 3 en 2. Bij geheeltallige deling vervalt de rest; % geeft die terug. Voor optellen, aftrekken en vermenigvuldigen gebruik je +, - en *. Variabelenamen kunnen binnen de expressie zonder dollarteken voorkomen: total=$(( price * qty )).

Met a=5 toont echo "$a+3" de tekst “5+3”. echo "$(( a + 3 ))" rekent en toont 8. De extra haakjes kiezen voor rekenkunde; $(a + 3) zou in plaats daarvan een commando met de naam a proberen uit te voeren.

Een teller begint met een waarde zoals count=0 en wordt bijgewerkt met count=$(( count + 1 )). Bash biedt ook (( count++ )); dit is een rekenkundig commando met een eigen afsluitstatus, wat belangrijk is in scripts die foutopties gebruiken.

Behoud de benodigde nauwkeurigheid

Bash rekent met gehele getallen. 7 / 2 geeft 3 en een decimale waarde zoals 2.5 veroorzaakt een rekenkundige syntaxisfout. Een afzonderlijke tool kan met decimalen rekenen:

echo "scale=2; 7 / 2" | bc

Dit levert 3.50 op. Vermenigvuldig bij het rekenen met gehele getallen vóór het delen als het product een breukdeel behoudt dat je nog nodig hebt. Voor 45 van de 60 geeft $(( 45 * 100 / 60 )) de waarde 75. Als je eerst deelt, geeft 45 / 60 nul, zodat $(( 45 / 60 * 100 )) nul blijft; het verloren breukdeel kun je niet herstellen door later te vermenigvuldigen.

Belangrijkste punten

  • $(command) vangt standaarduitvoer op en verwijdert nieuweregeltekens aan het einde.
  • $((expression)) rekent met gehele getallen.
  • Gebruik / voor geheeltallige deling en % voor de rest ervan.
  • Een teller slaat zijn bijgewerkte waarde na elke verhoging op.
  • Vermenigvuldigen vóór het delen kan vroegtijdig verlies van nauwkeurigheid bij gehele getallen voorkomen.
  • Gebruik een tool zoals bc als een decimaal resultaat nodig is.
3

Geef met afsluitcodes aan of een commando is geslaagd of mislukt

Een script heeft een resultaat nodig dat zowel mensen als programma's kunnen begrijpen. Uitvoer op het scherm legt uit wat er is gebeurd, terwijl een afsluitstatus een ander commando laat bepalen of het verdergaat. Je slaat die status op, controleert afhankelijke stappen en houdt mislukkingen in pijplijnen zichtbaar. Syntaxiscontroles, uitvoeringstraceringen en foutopties helpen de oorzaak van een mislukte uitvoering te vinden voordat latere commando's de gevolgen moeilijker zichtbaar maken.

3.1 Lees afsluitcodes uit, stel ze in en koppel er vervolgcommando's aan

Een commando meldt zijn resultaat op twee manieren: het kan tekst tonen en het geeft een afsluitstatus terug. Programma's gebruiken die status om te bepalen wat er daarna gebeurt. Een script kan een geruststellende melding tonen en toch zijn mislukt, of niets tonen en slagen.

Lees een status voordat die verandert

Een afsluitstatus is een geheel getal van 0 tot en met 255. Nul betekent succes. Een waarde anders dan nul meldt een mislukking of een ander gedocumenteerd resultaat. grep gebruikt bijvoorbeeld 0 voor een overeenkomst, 1 voor geen overeenkomst en 2 voor een fout. Een zoekopdracht zonder overeenkomst kan voor je taak een normale uitkomst zijn, ook al is de status anders dan nul.

$? bevat de status van het meest recente commando:

grep -q root /etc/passwd
status=$?
echo "Search status: $status"

De toekenning slaat het resultaat op voordat een ander commando het vervangt. In ls /missing; echo $?; echo $? geeft GNU ls de waarde 2 terug voor het ontoegankelijke pad op de commandoregel. De eerste echo toont 2 en slaagt daarna. De tweede toont 0, de status van die echo, niet van de oorspronkelijke bestandslijst.

Eindig met een bruikbaar resultaat

exit 1 beëindigt een script onmiddellijk en meldt 1 aan de aanroeper. exit 0 meldt succes. Een exit zonder getal gebruikt de status van het vorige commando; als het script normaal het einde bereikt, gebruikt het de status van het laatste commando. Kies codes binnen 0–255: exit 256 loopt terug naar 0 en zou ten onrechte succes melden.

Sommige statussen komen van Bash zelf:

CodeBetekenis
127Het commando is niet gevonden.
126Het commando is gevonden maar kon niet worden uitgevoerd.
128 + nHet commando is geëindigd door signaalnummer n.

Ctrl+C verzendt signaal 2, dus een commando dat op die manier wordt beëindigd, meldt gewoonlijk 130. Gewone programma's documenteren ook hun eigen codes; 1 en 2 hebben niet één universele betekenis voor alle tools.

Koppel afhankelijke commando's
mkdir -p ~/backup && cp notes.txt ~/backup/
cd /data/reports || exit 1

&& voert het volgende commando alleen uit na succes. Hier hangt het kopiëren af van het maken of vinden van de back-updirectory. || voert het volgende commando alleen uit na mislukking. Hier stopt een mislukte directorywijziging het script voordat latere commando's de verkeerde werkdirectory gebruiken.

true geeft 0 terug; false geeft 1 terug. Een ! vooraan keert succes of mislukking van een commando om. ! grep -q ERROR app.log slaagt als de zoekopdracht geen overeenkomende regel vindt, maar ook als grep met een fout mislukt; gebruik expliciete statuscontroles als je die uitkomsten moet onderscheiden.

Controleer een hele pijplijn
grep ERROR missing.log | wc -l

Standaard heeft een pijplijn de status van het laatste commando. grep mislukt op het ontbrekende bestand, maar wc leest een lege stroom, toont 0 en slaagt. De status van de pijplijn is daarom 0.

set -o pipefail laat een pijplijn mislukken als een van de onderdelen mislukt. Het geeft de meest rechtse status anders dan nul terug, of 0 als alle commando's slagen. Daardoor worden fouten eerder in de pijplijn zichtbaar voor if, &&, || en de aanroeper. Een planner kan dan een geslaagd rapport onderscheiden van een rapport dat zijn invoer nooit heeft gelezen.

Belangrijkste punten

  • Afsluitstatus 0 betekent succes; de betekenis van andere resultaten wordt door elk programma gedocumenteerd.
  • Sla $? onmiddellijk op als je die na een ander commando nodig hebt.
  • exit geeft een resultaat aan de aanroeper van het script.
  • && gaat verder na succes en || gaat verder na mislukking.
  • Zonder pipefail meldt een pijplijn alleen de status van het laatste commando.

3.2 Spoor fouten op en stop een script veilig

Bash gaat normaal gesproken verder nadat een commando is mislukt. Als het volgende commando van dat werk afhangt, kan doorgaan een kleine fout tot een groter probleem maken. Controleer afhankelijke stappen expliciet en gebruik daarna syntaxiscontroles en tracering om te achterhalen waarom een uitvoering anders verloopt dan je had bedacht.

Stop voordat een mislukte stap verdere gevolgen heeft
cd /backups || exit 1

Commando's daarna kunnen nu alleen worden uitgevoerd als de directorywijziging is geslaagd. Dit is belangrijk vóór bestandsbewerkingen: als een directorywijziging mislukt en het script doorgaat, verwijzen relatieve paden nog steeds naar de oude directory. Controleer de bestemming voordat je commando's uitvoert die bestanden wijzigen of verwijderen.

Een foutmelding en een status die mislukking aangeeft, zijn voor verschillende lezers bedoeld:

echo "Error: $file not found" >&2
exit 1

De melding gaat naar standaardfoutuitvoer, zodat standaarduitvoer beschikbaar blijft voor gegevens. Met ./report.sh > report.txt blijft de melding zichtbaar in de terminal terwijl de normale uitvoer in het bestand terechtkomt. Dankzij de status anders dan nul kan een ander programma de fout herkennen zonder de zin te lezen.

Controleer de syntaxis en traceer daarna de uitvoering
CommandoWat het doet
bash -n script.shLeest de syntaxis zonder commando's uit te voeren.
bash -x script.shVoert het script uit en toont geëxpandeerde commando's voordat ze worden uitgevoerd.

Een ontbrekende fi, done of afsluitend aanhalingsteken is een syntaxisprobleem. bash -n kan het vinden, vaak via een melding “unexpected end of file”. Voor een syntactisch geldig bestandspad met een spelfout moet je de uitvoering controleren.

Bij tracering krijgen commando's een + als voorvoegsel. Een regel zoals cp "$src" "$dest" laat zien welke paden daadwerkelijk zijn doorgegeven. Met set -x en set +x schakel je tracering voor een gedeelte in en uit.

Begrijp de foutopties

set -euo pipefail combineert drie instellingen:

  • -e stopt na een niet-afgehandelde mislukking van een commando.
  • -u meldt een niet-ingestelde variabele als fout.
  • pipefail zorgt ervoor dat mislukte onderdelen van een pijplijn de afsluitstatus van de pijplijn beïnvloeden.

-e laat ruimte voor verwachte mislukkingen in voorwaarden van if, while en until, ontkende commando's en commando's die niet de laatste zijn in lijsten met && of ||. Zonder pipefail leidt een mislukking vóór het laatste commando van een pijplijn niet tot stoppen. Expliciete controles blijven nuttig omdat ze aangeven wat het script moet doen als een bepaalde stap mislukt.

Een rekenkundig commando meldt ook waar of onwaar. (( count++ )) geeft status 1 terug als de oude waarde 0 is. Een niet-afgehandeld gebruik onder -e kan het script daardoor stoppen, ook al is de verhoging uitgevoerd. De toekenning count=$(( count + 1 )) vermijdt die status van het rekenkundige commando.

-u vangt een typefout zoals $filname op als alleen filename is ingesteld. Het wijst een variabele die bestaat maar leeg is niet af. ${dir:?not set} controleert bij die expansie of dir ontbreekt of leeg is. Een verwacht resultaat zonder overeenkomst kun je met een test afhandelen; command || true onderdrukt elke mislukking van dat commando, dus gebruik dit alleen als al die mislukkingen aanvaardbaar zijn.

Lees meldingen en ruim op

“Command not found” wijst op een probleem met een naam, een geïnstalleerd programma of PATH. “Permission denied” wijst op uitvoering of toegang tot een bestand. “Unary operator expected” komt vaak door een lege, niet-afgeschermde waarde in [ ]; “integer expression expected” betekent dat een numerieke test tekst heeft ontvangen.

Een EXIT-trap stelt een opruimactie in, zoals trap 'rm -f "$tmpfile"' EXIT, nadat aan tmpfile een waarde is toegekend. Het afgeschermde commando wordt uitgevoerd als Bash eindigt, ook bij een expliciete exit of een afsluiting na een fout onder -e. ShellCheck kan scripts vóór uitvoering ook controleren op veelvoorkomende fouten in afscherming en logica.

Belangrijkste punten

  • Controleer een stap voordat je commando's uitvoert die ervan afhangen.
  • Schrijf foutmeldingen naar standaardfoutuitvoer en meld mislukking met een status anders dan nul.
  • bash -n controleert de syntaxis; bash -x voert uit en traceert.
  • set -e heeft uitzonderingen voor geteste mislukkingen.
  • set -u vangt niet-ingestelde variabelen op, terwijl ${name:?message} ook lege waarden afwijst.
  • Een EXIT-trap kan een tijdelijk bestand verwijderen als het script eindigt.
4

Neem beslissingen en herhaal taken

Een bruikbaar script kiest acties en herhaalt die voor wisselende invoer. Tests zetten vragen over bestanden, tekst en getallen om in succes of mislukking. Vertakkingen kiezen een actie, terwijl lussen commando's op lijsten toepassen of doorgaan totdat een voorwaarde verandert. Je volgt de waarde die bij elke doorgang wordt gebruikt en behoudt spaties, records en tellers terwijl gegevens door het script gaan.

4.1 Test bestanden, tekenreeksen en getallen

Een voorwaarde in Bash is een commando waarvan de status waar of onwaar betekent. Met tests stel je vragen over paden, tekst en getallen. Kies een operator die past bij het soort waarde; dezelfde zichtbare tekens kunnen als tekst en als getal verschillende betekenissen hebben.

Geef de test afzonderlijke woorden

test -f notes.txt en [ -f notes.txt ] vragen of een pad naar een bestaand gewoon bestand verwijst. [ is een commando en het laatste argument moet ] zijn. Spaties scheiden de argumenten:

[ -f "$file" ]

Zonder de spatie na [ kan Bash zoeken naar een commando met de naam [-f. In [ "$a"="$b" ] vormen de ontbrekende spaties rond = één niet-leeg woord, waardoor de test waar is, ook als de waarden verschillen. Operators moeten afzonderlijke argumenten zijn.

Kies een bestandstest
OperatorWaar als het pad…
-eBestaat.
-fEen bestaand gewoon bestand is.
-dEen bestaande directory is.
-r, -w, -xLeesbaar, schrijfbaar of uitvoerbaar is voor de huidige gebruiker.
-sBestaat en groter is dan nul.
-LEen symbolische koppeling is.

Voor een directory met de naam logs slagen -e en -d, terwijl -f mislukt. Bestandstests volgen een symbolische koppeling normaal gesproken naar het doel; -L controleert de koppeling zelf. Een verbroken koppeling kan daardoor aan -L voldoen en niet aan -e.

Vergelijk tekst of gehele getallen

Tekenreekstests gebruiken = en != voor gelijkheid en ongelijkheid. -z controleert op lengte nul en -n op een lengte anders dan nul. [ "$answer" = yes ] komt precies overeen met “yes”; “Yes” en “yes ” zijn andere tekst. Dubbele aanhalingstekens behouden een lege waarde in de test.

Vergelijkingen van gehele getallen gebruiken -eq, -ne, -lt, -le, -gt en -ge: gelijk, ongelijk, kleiner dan, kleiner dan of gelijk aan, groter dan en groter dan of gelijk aan. [ "$count" -gt 100 ] vraagt of het getal groter is dan 100.

[ 07 -eq 7 ]
[ 07 = 7 ]

De numerieke vergelijking slaagt omdat de waarden gelijk zijn. De tekenreeksvergelijking mislukt omdat één tekst met een extra nul begint.

Gebruik geen losse > voor een numerieke test binnen [ ]. In [ 10 > 9 ] leidt Bash uitvoer om naar een bestand met de naam 9 en test het overblijvende niet-lege woord. In Bash vergelijkt de operator in [[ 10 < 9 ]] tekenreeksen, zodat het eerste teken 1 vóór 9 wordt gesorteerd. Gebruik -lt of -gt voor numerieke vergelijkingen, of Bash-rekenkunde zoals (( count > 100 )).

Combineer voorwaarden

[ ! -d "$dir" ] slaagt als het pad geen bestaande directory is; het kan een gewoon bestand zijn of ontbreken. [ -f "$f" ] && [ -r "$f" ] slaagt alleen als beide tests slagen. Afzonderlijke tests die met || zijn verbonden, slagen als er minstens één slaagt.

Bash heeft ook het sleutelwoord voor een testconstructie [[ ... ]]. Het voorkomt woordsplitsing van de variabele-expansies en staat && en || binnen de test toe. Een niet-afgeschermd patroon rechts van == wordt als patroon vergeleken: [[ $file == *.log ]] komt overeen met “app.log”. Als je dat patroon afschermt, wordt het letterlijk. Deze syntaxis vereist Bash; dash ondersteunt die niet.

Belangrijkste punten

  • Een test meldt waar met status 0 en onwaar met status 1.
  • Zet spaties rond [ en de operators en sluit af met ].
  • Bestandstests maken onderscheid tussen bestaan, type en toegang.
  • Tekenreeksgelijkheid vergelijkt tekst; numerieke operators vergelijken gehele getallen.
  • Gebruik -gt en -lt voor getallen, geen losse omleidingstekens.
  • Negatie keert een test om; && vereist beide voorwaarden.
  • Bash [[ ... ]] ondersteunt patronen en voorkomt woordsplitsing.

4.2 Kies acties met if, elif, else en case

Voorwaarden worden nuttig als ze acties kiezen. Een if-blok kiest een vertakking op basis van commandoresultaten. Een case-blok kiest een vertakking door één waarde met patronen te vergelijken. Beide maken de beschikbare acties zichtbaar in het script.

Laat een commando een vertakking kiezen
if grep -q ERROR app.log; then
  echo "Errors found"
else
  echo "No successful match"
fi

if voert het commando uit en gaat de eerste vertakking in als het 0 teruggeeft. Anders gaat het naar else. De zoekopdracht zelf is de voorwaarde; het is niet nodig die uit te voeren, iets te tonen en daarna $? te bekijken. Een fout van grep geeft ook een waarde anders dan nul, dus dit voorbeeld beschrijft de else-vertakking als een zoekopdracht zonder succesvolle overeenkomst, niet als bewijs dat het bestand geen fouten bevat.

then moet een nieuw commando beginnen: zet het op de volgende regel of na een puntkomma. fi sluit het blok af. Een ontbrekende fi veroorzaakt vaak een syntaxisfout bij het bestandseinde omdat Bash nog wacht op de afsluiting van het blok.

Orden overlappende voorwaarden

elif voegt een test toe die alleen wordt uitgevoerd als eerdere tests zijn mislukt. Voor een schijfgebruikspercentage als geheel getal:

if [ "$usage" -ge 90 ]; then
  echo "CRITICAL: disk ${usage}% full"
elif [ "$usage" -ge 75 ]; then
  echo "WARNING: disk ${usage}% full"
else
  echo "OK: disk ${usage}% full"
fi

Met usage=82 mislukt de eerste test en slaagt de tweede, wat “WARNING: disk 82% full” oplevert. Bij 95 wordt de eerste vertakking uitgevoerd en de waarschuwingsvertakking overgeslagen. Als de test op 75 eerst kwam, zou 95 daaraan voldoen en nooit de test voor kritiek bereiken. Orden overlappende bereiken zo dat de strengere voorwaarde aan bod komt.

Alleen de eerste vertakking waarvan de test slaagt, wordt uitgevoerd. else heeft geen voorwaarde nodig en verwerkt wat overblijft. Je kunt elif of else weglaten als de taak die niet nodig heeft.

Vergelijk één waarde met case
case "$1" in
  start) echo "Starting" ;;
  stop) echo "Stopping" ;;
  y|Y|yes) echo "Confirmed" ;;
  *) echo "Usage: $0 start|stop|y|Y|yes" >&2; exit 2 ;;
esac

Elk patroon eindigt met ), elke vertakking met ;; en esac sluit het blok af. De | binnen een patroon geeft alternatieven. De laatste * is het allesomvattende patroon en hoort als laatste omdat het met elke waarde overeenkomt.

case gebruikt bestandsnaampatronen, geen reguliere expressies. *.jpg komt overeen met een waarde die eindigt op .jpg. [0-9]* komt overeen met een waarde waarvan het eerste teken een cijfer is; de * kan daarna met elke volgende tekst overeenkomen, dus het patroon komt ook overeen met “7draft”. Het bewijst niet dat een hele waarde alleen cijfers bevat.

Kies de passende structuur

Gebruik case als één invoer, zoals een subcommando of antwoord, meerdere benoemde vormen heeft. Gebruik if als voorwaarden verschillende zaken onderzoeken, zoals of een bestand bestaat en of een aantal een grens overschrijdt. Een patroonvergelijking gaat over de tekens in een waarde; een bestandstest gaat over het pad op schijf. Een naam die eindigt op .log kan met een patroon overeenkomen, ook als zo'n bestand niet bestaat.

Belangrijkste punten

  • if kiest een vertakking op basis van de afsluitstatus van een commando; elk commando kan een voorwaarde zijn.
  • elif-tests worden alleen uitgevoerd nadat eerdere voorwaarden zijn mislukt.
  • Orden overlappende grenswaarden van de strengere naar de ruimere.
  • case kiest het eerste overeenkomende patroon en gebruikt ;; om elke vertakking af te sluiten.
  • Een patroonovereenkomst bewijst niet dat een bestand bestaat.

4.3 Herhaal commando's voor lijsten en bestanden met for

Een for-lus geeft dezelfde reeks commando's bij elke doorgang een nieuwe waarde. De lijst kan letterlijke woorden, overeenkomende bestandsnamen, een getallenbereik of de argumenten van het script bevatten. Bash kent één lijstitem toe aan de lusvariabele voordat het luslichaam wordt uitgevoerd.

Doorloop een vaste lijst
for host in web1 web2 db1; do
  echo "Checking $host"
done

De eerste doorgang heeft host=web1, de tweede host=web2 en de derde host=db1. De lus toont drie regels. do opent het luslichaam en done sluit het af. De variabele blijft na de lus beschikbaar en bevat de laatst toegekende waarde.

Een lus kan ook een resultaat opbouwen:

total=0
for n in 4 8 15; do
  total=$(( total + n ))
done
echo "$total"

Het opgeslagen totaal verandert van 0 naar 4, dan 12 en dan 27. Initialiseer het totaal vóór de lus zodat de eerste optelling een vastgelegde beginwaarde heeft.

Doorloop overeenkomende bestanden
for f in *.log; do
  [ -f "$f" ] || continue
  gzip -- "$f"
done

Bash expandeert het bestandsnaampatroon naar overeenkomende namen voordat het luslichaam wordt uitgevoerd. Elke overeenkomende bestandsnaam blijft één lijstitem, ook als die spaties bevat. Door "$f" binnen het luslichaam af te schermen, blijft dat item bij elkaar wanneer het aan gzip wordt doorgegeven. De test op een gewoon bestand slaat hier ook directory's over waarvan de naam eindigt op .log.

Met de standaardinstellingen voor bestandsnaamexpansie van Bash blijft een *.log zonder overeenkomsten letterlijk staan. Een lus zonder controle zou één keer worden uitgevoerd op de tekens *.log en het commando zou mislukken. [ -e "$f" ] || continue slaat niet-bestaande paden over; gebruik -f als je alleen gewone bestanden wilt.

Maak geen bestandsnamenlus op basis van $(ls). De uitvoer is tekst, dus woordsplitsing kan “my report.txt” in twee lijstitems veranderen. Een bestandsnaampatroon levert de bestandsnamen al met hun grenzen intact.

Maak van elke oude naam een nieuwe
for f in *.jpeg; do
  [ -f "$f" ] || continue
  mv -- "$f" "${f%.jpeg}.jpg"
done

${f%.jpeg} verwijdert het achtervoegsel .jpeg uit de waarde. Voor “beach day.jpeg” wordt de bestemming “beach day.jpg”. De twee afgeschermde argumenten houden beide paden intact. -- geeft mv aan dat volgende argumenten namen zijn, ook als er één met - begint. Gebruik bij het uitproberen van het voorbeeld een bestemmingsmap zonder conflicterende namen, omdat mv een bestaande bestemming kan vervangen.

Tel door een bereik

for i in {1..5} levert 1 tot en met 5. Bash expandeert de accolades voordat het variabelen expandeert, dus {1..$n} levert geen bereik met variabele lengte op. Gebruik voor een opgeslagen grens de rekenkundige vorm:

for (( i = 1; i <= n; i++ )); do
  echo "$i"
done

De eerste expressie initialiseert de teller, de middelste test die vóór elke doorgang en de laatste werkt die bij. for i in $(seq 1 "$n") levert ook een getallenlijst voor een geschikte positieve gehele grenswaarde. De bewust niet-afgeschermde substitutie levert hier afzonderlijke getallen.

Voor argumenten levert for arg in "$@" één item per oorspronkelijk argument. De kortere vorm for arg; do betekent hetzelfde, inclusief het behoud van spaties binnen elk argument.

Belangrijkste punten

  • Een for-lus voert het luslichaam één keer per lijstitem uit.
  • Bestandsnaampatronen leveren volledige bestandsnamen; scherm de lusvariabele in het luslichaam af.
  • Een bestandsnaampatroon zonder overeenkomsten blijft bij de standaardinstellingen van Bash letterlijk staan, dus controleer bestandslussen.
  • Vermijd bestandsnamenlussen die zijn opgebouwd uit $(ls).
  • Bereiken tussen accolades staan vast vóór variabele-expansie; gebruik een rekenkundige lus voor een variabele grens.
  • "$@" behoudt de oorspronkelijke grenzen tussen argumenten.

4.4 Herhaal commando's totdat een voorwaarde verandert met while en until

Sommige herhalingen eindigen wanneer een voorwaarde verandert, niet wanneer een lijst opraakt. while en until testen vóór elke doorgang. Het luslichaam van while wordt uitgevoerd zolang de voorwaarde slaagt; dat van until zolang de voorwaarde mislukt. Beide lussen kunnen nul keer worden uitgevoerd.

Werk bij waarvan de voorwaarde afhangt
i=1
while [ "$i" -le 3 ]; do
  echo "Attempt $i"
  i=$(( i + 1 ))
done

De voorwaarde ziet eerst 1, dan 2 en dan 3. Het luslichaam toont die drie pogingnummers en verhoogt telkens de teller. Na de wijziging naar 4 mislukt de volgende test en eindigt de lus. Als de wijziging ontbrak, zou i op 1 blijven en zou de lus doorgaan. Ctrl+C stopt een actieve voorgrondlus.

Om op een bestand te wachten:

until [ -f /tmp/export.done ]; do
  sleep 5
done

Als het bestand al bestaat, wordt het luslichaam nooit uitgevoerd. Anders pauzeert sleep 5 vijf seconden vóór de volgende controle. Een pauze voorkomt dat de lus voortdurend test en processortijd verspilt.

Lees records als regels
while IFS= read -r line; do
  echo "Host: $line"
done < hosts.txt

read levert bij elke doorgang één regel en geeft bij het bestandseinde een status terug die mislukking aangeeft. IFS= behoudt spaties aan het begin en einde van de regel; -r behoudt backslashes. De invoeromleiding na done voert invoer toe aan de hele lus, niet alleen aan het laatste commando.

Een regel zoals “web1 production” blijft één waarde. for line in $(cat hosts.txt) zou splitsen bij spaties, tabs en nieuweregeltekens en die twee woorden als afzonderlijke iteraties behandelen. Die vorm kan willekeurige records per regel niet behouden.

Behoud wijzigingen na de lus

Een pipe naar een lus, zoals cat hosts.txt | while read -r line; do ...; done, voert de lus in Bash normaal gesproken uit in een kindproces. Een teller die daar wordt gewijzigd, gaat voor het ouderproces verloren als het kindproces eindigt. Leid het bestand om naar de lus als latere commando's de opgebouwde waarden nodig hebben:

count=0
while IFS= read -r line; do
  count=$(( count + 1 ))
done < hosts.txt
echo "$count"

Dit verwerkt regels die eindigen op een nieuweregelteken en behoudt de bijgewerkte telling in de huidige shell. Er is geen pijplijn die een kindproces voor de lus maakt.

Verwerk het laatste record en voortijdige beëindiging

Een bestand kan eindigen met tekst maar zonder afsluitend nieuweregelteken. read slaat die laatste tekst op maar meldt mislukking, zodat een gewone while read het luslichaam voor dat record niet ingaat. Voeg een tweede test toe om de opgeslagen niet-lege tekst te accepteren:

while IFS= read -r line || [ -n "$line" ]; do
  echo "Host: $line"
done < hosts.txt

break verlaat de lus onmiddellijk. continue slaat de overige commando's in de huidige doorgang over en gaat daarna terug naar de volgende controle van de voorwaarde. Een while true-lus heeft daarom een break, een exit of een signaal nodig om te eindigen; die kan een menu ondersteunen dat stopt als de invoer “q” is. Plaats in een tellerlus een wijziging vóór elke continue die die wijziging anders zou overslaan, anders kan die doorgang zich eindeloos herhalen.

Belangrijkste punten

  • while herhaalt na succes; until herhaalt na mislukking.
  • Beide lussen testen voordat ze hun luslichaam ingaan.
  • Werk een teller bij of pauzeer een lus die herhaaldelijk controleert, zodat die voortgang maakt zonder voortdurend te wachten en te controleren.
  • IFS= read -r behoudt spaties en backslashes in invoer per regel.
  • Leid een bestand om naar de lus om gewijzigde variabelen in de huidige shell te behouden.
  • Een extra test op een niet-lege tekenreeks behoudt een laatste record zonder nieuweregelteken.
  • break verlaat een lus; continue slaat over naar de volgende doorgang.
5

Geef argumenten door aan scripts

Met commandoregelargumenten kan één script veel taken uitvoeren zonder de code te bewerken. Je leest afzonderlijke waarden, behoudt een volledige argumentenlijst en verwerkt opties vooraan. Voordat het werk begint, tel en controleer je de invoer, leg je een correcte aanroep uit en geef je standaardwaarden voor optionele waarden op. Het resultaat kan vanaf een prompt of zonder toezicht worden uitgevoerd, met duidelijke meldingen en een afsluitstatus als de invoer onbruikbaar is.

5.1 Lees positionele parameters en het aantal argumenten uit

Argumenten maken van een script met vaste invoer een herbruikbaar commando. Bash plaatst de woorden na de scriptnaam in positionele parameters. Hun grenzen worden bepaald door de aanroepende shell, dus aanhalingstekens zijn belangrijk bij zowel de aanroep van het script als het gebruik van die waarden.

Herken de parameters
./backup.sh /home/sam/docs /mnt/usb

Binnen het script is $0 gelijk aan ./backup.sh, $1 aan /home/sam/docs en $2 aan /mnt/usb. $# is 2, het aantal argumenten. Het script kan cp -r "$1" "$2" gebruiken om de bronmap naar de bestemming te kopiëren zonder een van beide paden vast in de code te zetten.

$0 geeft de naam aan waarmee het script is gestart; die telt niet mee in $#. Bij ./greet.sh Ana "Lee Kim" is het eerste argument “Ana” en het tweede “Lee Kim”. Zonder de aanhalingstekens rond de tweede naam zou het script drie argumenten ontvangen.

Gebruik accolades na het negende argument

$1 tot en met $9 duiden de eerste negen positionele parameters aan. De tiende vereist ${10} en latere posities volgen dezelfde vorm. $10 betekent de expansie van $1 gevolgd door het letterlijke teken 0. Als het eerste argument “Ana” is, wordt $10 gelijk aan “Ana0”, ook als er een tiende argument bestaat.

Een weggelaten parameter expandeert onder normale instellingen naar lege tekst. Bij twee argumenten ontbreekt $3; onder set -u veroorzaakt expansie ervan een fout voor een niet-ingestelde variabele. Controleer het aantal voordat je verplichte posities leest, of gebruik een expansie die een standaardwaarde levert.

Behoud alle grenzen tussen argumenten

Stel dat een script "a b" en c ontvangt. Vergelijk:

ExpansieDoorgegeven woorden
"$@"Twee: “a b” en “c”.
"$*"Eén: “a b c”, met de gebruikelijke spatie als scheidingsteken.
$@Drie: “a”, “b” en “c” bij normale splitsing.

"$@" is de gebruikelijke keuze om argumenten door te geven:

for arg in "$@"; do
  echo "Argument: $arg"
done

De lus wordt bij die aanroep twee keer uitgevoerd, één keer per oorspronkelijk argument. Zonder argumenten draait de lus nul keer. Dubbele aanhalingstekens rond "$@" hebben een speciale betekenis: elke positionele parameter blijft een afzonderlijk woord, dus de aanhalingstekens voegen niet de hele lijst samen tot één woord.

"$*" voegt waarden samen met het eerste teken van IFS, normaal gesproken een spatie. Dat kan nuttig zijn voor één tekenreeks om te tonen, maar het verliest de afzonderlijke grenzen die een later commando nodig kan hebben.

Verwerk parameters met shift

shift verwijdert de eerste positionele parameter, schuift de latere op en verlaagt $#. Bij de back-upaanroep zorgt één shift ervoor dat $1 gelijk wordt aan /mnt/usb en het aantal aan 1. shift 2 verwijdert de eerste twee parameters tegelijk.

Dit maakt een lus mogelijk die $1 bekijkt, verwerkt en daarna doorschuift vóór de volgende doorgang. Test met [ "$#" -gt 0 ] of er argumenten over zijn; anders kan het script een ontbrekende waarde lezen of proberen verder te schuiven dan de beschikbare argumenten. Doorschuiven verandert $0 niet en kan de argumentenlijst van de oudershell die het script startte niet wijzigen.

Belangrijkste punten

  • $0 is de aanroepnaam, terwijl $1 en volgende de argumenten bevatten.
  • $# telt argumenten, waarbij afgeschermde spaties binnen één argument blijven.
  • Gebruik ${10} voor het tiende argument; $10 is $1 gevolgd door 0.
  • "$@" behoudt argumenten afzonderlijk, terwijl "$*" ze samenvoegt.
  • shift verwijdert voorste parameters en verandert de overige posities.

5.2 Controleer argumenten, toon een gebruiksinstructie en stel standaardwaarden in

Een script moet vaststellen of zijn invoer bruikbaar is voordat het aan het werk gaat. Controleer het aantal argumenten en controleer daarna hun betekenis. Optionele invoer kan standaardwaarden hebben; ontbrekende verplichte invoer vereist een duidelijke foutmelding en een afsluitstatus anders dan nul.

Leg de verwachte aanroep uit
if [ "$#" -ne 2 ]; then
  echo "Usage: $0 SOURCE DEST" >&2
  exit 2
fi

Dit controleert het aantal voordat $1 of $2 wordt geëxpandeerd, dus het werkt ook onder set -u. De gebruiksinstructie gaat naar standaardfoutuitvoer. Hoofdletters duiden waarden aan die de gebruiker opgeeft, [DEST] zou een optionele bestemming betekenen en FILE... betekent één of meer bestandsargumenten. Een hulpoptie zoals -h toont normaal gesproken de gebruiksinstructie en sluit af met 0, omdat hulp vragen geslaagd gebruik is.

Alleen het aantal argumenten kan niet aangeven of een bron bruikbaar is. [ -d "$1" ] controleert op een bestaande directory. Een test op een gewoon bestand kan bestanden selecteren, maar het resultaat van de bewerking zelf moet nog steeds worden gecontroleerd: rechten of andere fouten kunnen lezen verhinderen.

Gebruik een standaardwaarde of vereis een waarde
logdir=${1:-/var/log}
src=${1:?Usage: backup.sh SOURCE [DEST]}

De eerste vorm gebruikt /var/log als de eerste parameter ontbreekt of leeg is. De tweede stopt een niet-interactief script in beide gevallen en toont de melding op standaardfoutuitvoer. De dubbele punt is onderdeel van beide vormen. Een standaardwaarde is een waarde die voor deze expansie wordt gebruikt; ${1:-...} voegt geen argument toe aan de lijst met positionele parameters.

Houd gedeeltelijke mislukking bij

Een script dat bestanden telt, kan na ongeldige invoer doorgaan en toch melden dat de hele taak niet is voltooid:

#!/bin/bash
if [ "$#" -eq 0 ]; then
  echo "Usage: $0 FILE..." >&2
  exit 2
fi
status=0
for f in "$@"; do
  if [ -f "$f" ]; then
    if lines=$(wc -l < "$f"); then
      echo "$f: $lines lines"
    else
      echo "$f: could not count lines" >&2
      status=1
    fi
  else
    echo "$f: not a regular file" >&2
    status=1
  fi
done
exit "$status"

Voor notes.txt missing.txt toont het script de telling van het leesbare bestand en meldt het het ontbrekende bestand, waarna het afsluit met 1. De toekenning wordt rechtstreeks getest, zodat een leesfout geen geslaagde lege telling wordt. Later succes zet de opgeslagen foutvlag nooit terug op 0.

Verwerk eenvoudige opties vóór bestandsnamen
verbose=0
while [ "$#" -gt 0 ]; do
  case "$1" in
    -v) verbose=1; shift ;;
    -h) echo "Usage: $0 [-v] FILE..."; exit 0 ;;
    --) shift; break ;;
    -*) echo "Unknown option: $1" >&2; exit 2 ;;
    *) break ;;
  esac
done

Elke herkende optie wordt met shift verwerkt en verwijderd. Het eerste gewone argument beëindigt de optieverwerking; -- beëindigt die ook en wordt zelf verwijderd. De resterende "$@" bevat de bestandsnamen, inclusief een naam die na -- met - begint. Bash getopts ondersteunt uitgebreidere verwerking van korte opties.

Een script zonder toezicht heeft alle verplichte invoer nodig uit argumenten, standaardwaarden of configuratie. read kan blijven wachten op een terminal of onmiddellijk mislukken bij het bestandseinde. Als je een ontbrekend argument door een prompt vervangt, heeft een geplande taak geen betrouwbare manier om verder te gaan.

Belangrijkste punten

  • Controleer het aantal voordat je verplichte argumenten expandeert.
  • Een gebruiksinstructie noemt verplichte, optionele en herhaalbare invoer.
  • ${1:-value} levert een standaardwaarde; ${1:?message} wijst een ontbrekende of lege waarde af.
  • Controleer het resultaat van de bewerking ook nadat je het bestandstype van de invoer hebt gecontroleerd.
  • Behoud een algemene status die mislukking aangeeft als je doorgaat met meerdere invoerwaarden.
  • Verwerk opties met shift en behandel -- als het einde van de opties.
6

Plan scripts zodat ze automatisch worden uitgevoerd

Een script dat zonder toezicht draait, heeft een planning nodig en een manier om de resultaten te bekijken. Cron geeft overeenkomende kloktijden weer in één regel; systemd koppelt een service aan een timer. Je leert beide vormen lezen, zorgt voor de omgeving die de taak nodig heeft en houdt de uitvoer beschikbaar. Door de volgende activering en het laatste taakresultaat afzonderlijk te controleren, onderscheid je een actieve planning van werk dat daadwerkelijk is geslaagd.

6.1 Plan taken met cron

Cron start commando's op overeenkomende kloktijden. De crontab van elke gebruiker bewaart diens planning en taken worden als die gebruiker uitgevoerd. Een gepland script heeft zowel een correcte tijdexpressie nodig als een omgeving die de paden, invoer en uitvoerbestemming biedt.

Lees de vijf velden

Gebruik crontab -e om je tabel te bewerken en crontab -l om die te bekijken. crontab -r verwijdert de hele tabel zonder te vragen; gebruik de editor om één taak te verwijderen.

Veld, op volgordeWaarden
Minuut0–59
Uur0–23
Dag van de maand1–31
Maand1–12
Dag van de week0–7; 0 en 7 betekenen zondag
30 2 * * * /home/sam/bin/backup.sh

Dit wordt elke dag om 02.30 uur uitgevoerd. Sterretjes accepteren elke waarde in een veld. 0 9 * * 1-5 kiest 09.00 uur op werkdagen en 0 0 1 * * kiest middernacht op de eerste dag van elke maand. Tijden gebruiken de tijdzone van het systeem, tenzij de cron-configuratie een andere ondersteunde tijdzone opgeeft.

Combineer bereiken, lijsten en stapgroottes

Een komma somt waarden op: 1,15 in het veld voor de dag van de maand kiest de eerste en de vijftiende. Een koppelteken geeft een bereik en / leidt een stapgrootte in. */15 in het minutenveld kiest 0, 15, 30 en 45.

*/20 8-10 * * * kiest drie minuten in elk van drie uren: negen dagelijkse uitvoeringen, beginnend om 08.00 uur en eindigend om 10.40 uur. Stapgroottes beginnen opnieuw binnen hun veld. */45 wordt uitgevoerd op minuut 0 en minuut 45 van elk uur; de tussenpoos tot minuut 0 van het volgende uur is slechts 15 minuten.

Als zowel de dag van de maand als de dag van de week is beperkt, is een overeenkomst met een van beide voldoende. 0 12 13 * 5 kiest het middaguur op de 13e en op vrijdagen, niet alleen op vrijdag de 13e. De andere velden moeten nog steeds overeenkomen.

Speciale tekenreeksen vervangen alle vijf velden: @hourly, @daily, @weekly, @monthly, @yearly en @reboot. @daily betekent middernacht, terwijl @reboot eenmaal bij het opstarten wordt uitgevoerd.

Geef paden op en bewaar de uitvoer

Cron gebruikt normaal gesproken /bin/sh voor de commandoregel, een korte PATH en geen opstartinstellingen van een interactieve shell. De eigen Bash-shebang van een uitvoerbaar script kiest nog steeds Bash. Gebruik absolute paden voor het script en de bestanden ervan, of stel PATH bovenaan de crontab in.

30 2 * * * /home/sam/bin/backup.sh >> /home/sam/backup.log 2>&1

De taak voegt beide uitvoerstromen achteraan toe aan het logbestand. Zonder omleiding verstuurt cron uitvoer per e-mail als e-mail is geconfigureerd, ook via MAILTO; anders kan uitvoer verloren gaan. Een procentteken heeft een speciale rol in een crontab-commando: het begint een nieuwe regel en de daaropvolgende invoer. Scherm een datumformaat daar af met een backslash, zoals in date +\%F. Een datumcommando binnen een afzonderlijk script gebruikt de gewone vorm %F.

Maak onderscheid tussen systeemplanningen en inhaaltaken

/etc/crontab en bestanden in /etc/cron.d/ voegen na de vijf tijdvelden een gebruikersveld toe. Zo wordt 30 2 * * * root /usr/local/bin/backup.sh als root uitgevoerd. Voeg dat gebruikersveld niet toe aan een persoonlijke crontab.

Veel distributies voeren ook geschikte uitvoerbare bestanden uit in /etc/cron.daily/, /etc/cron.weekly/ en /etc/cron.monthly/. De standaardnaamgevingsregels van Debian voor run-parts slaan namen met punten over, dus gebruik daar backup-notes, niet backup-notes.sh. Cron mist tijdstippen die verstrijken terwijl de computer uitstaat. Anacron kan periodieke dagelijkse, wekelijkse of maandelijkse taken na het opstarten inhalen.

Belangrijkste punten

  • Een persoonlijke crontab heeft vijf tijdvelden die direct door een commando worden gevolgd.
  • Lijsten, bereiken en stapgroottes selecteren waarden binnen elk veld.
  • Bij beperkte velden voor dag van de maand en dag van de week is een overeenkomst met een van beide voldoende.
  • Gebruik absolute paden en een uitvoerlogbestand voor taken zonder toezicht.
  • Scherm % in een crontab-commando af met een backslash, ook in datumformaten.
  • Systeemcrontabs voegen een gebruikersveld toe; voor periodieke mappen gelden ook regels voor welke bestanden geschikt zijn.
  • Cron mist uitvoeringen terwijl de machine uitstaat; anacron ondersteunt het inhalen van periodieke taken.

6.2 Plan taken met systemd-timers

Systemd scheidt het werk van de planning. Een service-unit beschrijft het uit te voeren commando. Een timerunit beschrijft wanneer het moet starten. Standaard activeert backup.timer de unit backup.service, waarbij de gedeelde basisnaam het paar verbindt.

Schrijf de service en de kalenderplanning

Plaats deze systeemunits in /etc/systemd/system/:

# backup.service
[Unit]
Description=Nightly backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Type=oneshot is geschikt voor een script dat één keer wordt uitgevoerd en eindigt. Gebruik een absoluut commandopad en maak het script uitvoerbaar met een Bash-shebang. De timer levert de planning:

# backup.timer
[Unit]
Description=Run backup.service daily at 02:30

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar vergelijkt datums en kloktijden. Hier accepteert de datum met jokertekens elke dag. Persistent=true maakt inhalen mogelijk nadat de timer inactief was: als minstens één kalenderuitvoering is gemist, start de timer de service eenmaal bij heractivering. Niet elke gemiste uitvoering wordt opnieuw uitgevoerd.

Laad en activeer de timer
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

Herlaad na het maken of wijzigen van unitbestanden. enable --now start de timer onmiddellijk en schakelt die in voor toekomstige systeemstarts. Alleen de service inschakelen maakt geen planning. Test het werk afzonderlijk met sudo systemctl start backup.service.

Kies kloktijd of verstreken tijd
InstellingPlanning
OnCalendar=Mon..Fri *-*-* 09:00:00Werkdagen om 09.00 uur
OnCalendar=*:0/15Minuut 0, 15, 30 en 45 van elk uur
OnBootSec=10minTien minuten na het opstarten
OnUnitActiveSec=1hEén uur nadat de service voor het laatst is geactiveerd

Kalenderexpressies kunnen daily gebruiken voor elke dag om middernacht of weekly voor maandag om middernacht. Controleer een expressie met systemd-analyze calendar "Mon..Fri 09:00" om de interpretatie en het volgende tijdstip te zien.

De laatste twee instellingen zijn monotone timers: ze meten de verstreken tijd vanaf een gebeurtenis. Combineer ze voor een eerste uitvoering na het opstarten en latere activeringen per uur. Persistent=true geldt voor kalendertimers; het voegt geen inhaalfunctie voor kalendertaken toe aan monotone timers.

Bekijk planning en resultaten afzonderlijk

systemctl list-timers toont de volgende en laatste activeringen. systemctl status backup.service toont het resultaat van de service en journalctl -u backup.service toont de uitvoer en fouten. Een vermelde volgende uitvoering toont aan dat een planning actief is, niet dat de vorige taak van het script is geslaagd.

Timers hebben een tijdvenster waarbinnen ze afgaan. AccuracySec staat standaard op één minuut; AccuracySec=1s verkleint het venster waarin uitvoeringen worden samengevoegd. RandomizedDelaySec voegt bewust een willekeurige vertraging toe om werk over machines te spreiden. Deze instellingen garanderen bij belasting geen exacte startseconde.

Voer een eigen gebruikerstimer uit

Gebruikersunitbestanden staan in ~/.config/systemd/user/ en commando's gebruiken systemctl --user, waaronder daemon-reload, enable --now en list-timers. Een gebruikersbeheerder draait normaal gesproken tijdens de sessie van die gebruiker. Een beheerder kan met loginctl enable-linger username gebruikersbeheer zonder aanmeldsessie inschakelen om het beschikbaar te houden zonder aanmelding.

Cron heeft een compacte tijdregel nodig en werkt zonder systemd. Timers voegen een serviceresultaat en logboek, het inhalen van kalendertaken en meer controle toe. Geen van beide laadt normaal gesproken ~/.bashrc; beide hebben scripts nodig die werken met expliciete paden en zonder interactieve prompts.

Belangrijkste punten

  • De service zegt wat moet worden uitgevoerd; de timer zegt wanneer.
  • Herlaad gewijzigde units en schakel de .timer in met --now.
  • Kalendertimers volgen de kloktijd; monotone timers meten vanaf gebeurtenissen.
  • Persistent=true haalt gemiste kalendertaken eenmaal in bij heractivering.
  • Controleer zowel de volgende activering van de timer als de status en het logboek van de service.
  • Gebruikerstimers hebben een actieve gebruikersbeheerder nodig, met gebruikersbeheer zonder aanmeldsessie voor uitvoeringen zonder sessie.

Shellscripts: voorbeelden

6 Walkthroughs

1

Sla een herhaalbaar mapoverzicht op

9 stappen
Maak een klein Bash-overzicht, voer het uit via een pad en maak onderscheid tussen uitvoeren en inlezen.
  1. 1
    IntroductieGeef een terugkerende taak één plek

    Je controleert vaak waar je bent, toont de inhoud van een map en geeft een melding dat de taak is voltooid. Door de commando's op te slaan kun je ze in dezelfde volgorde herhalen.

    Een script is een bestand met platte tekst dat door een interpreter wordt gelezen. Je maakt een klein overzicht, kiest expliciet Bash en voert het uit in een kindshell. De naam, het uitvoerrecht en de locatie van het bestand beantwoorden elk een andere vraag over het starten ervan.

  2. 2
    VoorbeeldSchrijf de commando's op volgorde

    Sla dit als folder-report.sh op in een editor voor platte tekst:

    #!/bin/bash
    pwd
    ls
    echo "Report finished"
    

    De shebang kiest Bash als het bestand direct wordt uitgevoerd. Het commentaar legt de taak uit maar wordt niet uitgevoerd. Daarna voert Bash pwd, ls en echo in die volgorde uit. De extensie .sh helpt een lezer het bestand te herkennen; die kiest niet de interpreter.

  3. 3
    UitdagingControleer wat de taal kiest

    Een collega verandert de eerste regel in #!/bin/sh en voegt later [[ ... ]] toe. Het bestand eindigt nog steeds op .sh. Waarom kan het mislukken?

    ---reveal---

    De shebang kiest sh, wat dash kan zijn en mogelijk [[ ... ]] van Bash niet begrijpt. De extensie kiest de taal niet. Herstel een Bash-shebang voor Bash-functies, met #! helemaal aan het begin van de eerste regel.

  4. 4
    UitlegLees het bestand eerst met Bash

    Voer bash folder-report.sh uit. Dit start Bash en geeft het leesbare scriptbestand door; uitvoerrecht op het script is niet vereist. De gekozen interpreter is al Bash, dus de shebang maakt die keuze niet.

    Je zou een pad, een bestandslijst en de melding “Report finished” moeten zien. Relatieve paden die commando's in het script gebruiken, worden bepaald vanuit de werkdirectory, niet automatisch vanuit de map van het scriptbestand.

  5. 5
    VoorbeeldMaak directe uitvoering mogelijk

    Voeg uitvoerrecht toe voor de eigenaar en voer het exacte pad uit:

    chmod u+x folder-report.sh
    ./folder-report.sh
    

    De ./ duidt de huidige directory aan. Directe uitvoering gebruikt de shebang van het bestand. Als het bestand leesbaar maar niet uitvoerbaar is, kan het eerdere bash-commando werken terwijl dit commando mislukt met “Permission denied”. Rechten en de keuze van de interpreter zijn afzonderlijke onderdelen van het starten.

  6. 6
    TipZoek het script op naam

    Als je folder-report.sh zonder schuine streep typt, vraag je Bash om PATH te doorzoeken. De huidige directory staat normaal gesproken niet in die lijst.

    Met een persoonlijke bin-directory kun je het script vanuit andere mappen uitvoeren als die directory op PATH staat. Bekijk echo "$PATH" en gebruik command -v folder-report.sh om te zien welk uitvoerbaar bestand die naam kiest. Als een oude kopie eerder op PATH staat, verandert het bewerken van een nieuwere kopie elders niet wat deze naam uitvoert.

  7. 7
    UitdagingHoud een directorywijziging in de juiste shell

    Het script voert nu eerst cd /var/log uit. Staat je terminal daar nadat ./folder-report.sh is geëindigd? Hoe kan een instellingenbestand de terminal daarheen verplaatsen?

    ---reveal---

    Het uitgevoerde script draait in een kindshell, dus de directorywijziging verplaatst de bovenliggende terminal niet. Als je een bestand inleest met source ./settings.sh, worden de commando's in de huidige shell uitgevoerd en kan de directory van die sessie veranderen. Inlezen gebruikt de taal van de huidige shell.

  8. 8
    UitdagingOnderzoek het starten voordat je commando's bewerkt

    Een leesbaar overzicht werkt met bash folder-report.sh. Directe uitvoering meldt “Permission denied” en alleen de naam typen meldt “command not found”. Welke twee problemen bij het starten moet je controleren?

    ---reveal---

    Controleer het uitvoerrecht van het script voor directe uitvoering. Controleer daarna PATH of gebruik het expliciete ./-pad om het te vinden. Een geldige Bash-shebang kiest de interpreter, maar kan geen rechten verlenen of het bestand op PATH plaatsen.

  9. 9
    SamenvattingBij het starten maak je meerdere afzonderlijke keuzes

    Het bestand bevat de reeks commando's. De interpreter leest de taal ervan, rechten maken directe uitvoering mogelijk en PATH of een schuine streep bepaalt waar het bestand staat.

    Een uitgevoerd script werkt in een kindshell. Een ingelezen instellingenbestand werkt in de shell die al openstaat, zodat de toekenningen en directorywijzigingen in die sessie kunnen blijven bestaan.

2

Maak een rapportnaam met datum zonder spaties te verliezen

11 stappen
Volg waarden door toekenning, afscherming, het opvangen van commando-uitvoer en berekeningen met gehele getallen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVolg een waarde naar een commando
  2. 2
    VoorbeeldSla een bestemming met meerdere woorden op
  3. 3
    VerbandGeef de instelling door aan een kindproces
  4. 4
    UitdagingScheid een naam van het achtervoegsel
  5. 5
    VoorbeeldBehoud het opgeslagen pad
  6. 6
    UitdagingKies vaste of veranderende tekst
  7. 7
    VoorbeeldVang een datum op voor de naam
  8. 8
    VoorbeeldBereken de waarde voordat je die invoegt
  9. 9
    UitdagingZoek het verloren breukdeel
  10. 10
    UitdagingCombineer het pad en de opgevangen waarde
  11. 11
    SamenvattingMaak onderscheid tussen de drie taken
3

Voorkom dat een mislukte zoekopdracht een geslaagd rapport wordt

10 stappen
Onderzoek een pijplijn, behoud een mislukking en kies de juiste controle om fouten op te sporen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBehandel het resultaat als onderdeel van de taak
  2. 2
    VoorbeeldZie de verborgen mislukking eerder in de pijplijn
  3. 3
    KernpuntLaat de pijplijn de mislukking melden
  4. 4
    UitdagingSla de relevante status op
  5. 5
    VoorbeeldHandel het mislukte werk expliciet af
  6. 6
    UitlegKies tussen syntaxiscontrole en uitvoering traceren
  7. 7
    UitlegLees de foutopties als afzonderlijke instellingen
  8. 8
    UitdagingLeg uit waarom dit script doorgaat
  9. 9
    UitdagingHoud de aanroeper op de hoogte
  10. 10
    SamenvattingLees zowel de gegevens als het resultaat
4

Bekijk binnenkomende bestanden en lees hun records

15 stappen
Gebruik tests, geordende vertakkingen en lussen om bestanden te verwerken zonder namen of regels te verliezen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieLaat elk soort invoer de volgende stap bepalen
  2. 2
    VoorbeeldKies een test voor het type pad
  3. 3
    UitlegVergelijk waarden op de juiste manier
  4. 4
    UitdagingInterpreteer een ontkende bestandstest
  5. 5
    VoorbeeldKies een actie met een commandoresultaat
  6. 6
    UitdagingVolg overlappende grenswaarden
  7. 7
    UitlegVergelijk een actiewoord met case
  8. 8
    VoorbeeldGeef een lus met een bestandsnaampatroon één bestand per doorgang
  9. 9
    UitdagingLeg uit wat er bij een lege map gebeurt
  10. 10
    TipKies een variabele getallengrens
  11. 11
    VoorbeeldLees een record zonder de spaties te splitsen
  12. 12
    UitdagingBehoud het laatste record zonder nieuweregelteken
  13. 13
    VerbandWacht zonder voortdurend te controleren
  14. 14
    UitdagingOnderzoek een totaal dat nul blijft
  15. 15
    SamenvattingStem de structuur af op de gegevens
5

Accepteer bestandsinvoer en meld gedeeltelijke mislukking

10 stappen
Controleer een herbruikbaar commando, verwerk een optie en behoud het algemene resultaat.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieMaak invoer onderdeel van de commandoaanroep
  2. 2
    VoorbeeldBekijk de grenzen van de aanroep
  3. 3
    UitlegVerwerk de optie vooraan
  4. 4
    UitdagingTel een leeg argument mee
  5. 5
    VoorbeeldWijs een aanroep zonder bestandsinvoer af
  6. 6
    UitlegKies alleen voor optionele invoer een standaardwaarde
  7. 7
    VoorbeeldControleer de leesbewerking zelf
  8. 8
    UitdagingOnthoud de eerdere mislukking
  9. 9
    UitdagingStop de optieverwerking vóór een bestandsnaam met een koppelteken
  10. 10
    SamenvattingGeef herbruikbare commando's betrouwbare afspraken
6

Plan een rapport en controleer de laatste uitvoering

12 stappen
Lees cron-expressies, maak een timer met bijbehorende service en maak onderscheid tussen geplande tijd en geslaagde taak.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductiePlan alleen werk waarvoor alle invoer beschikbaar is
  2. 2
    VoorbeeldLees een persoonlijke crontab-vermelding
  3. 3
    UitdagingVolg een stapgrootte in minuten over een uurgrens
  4. 4
    TipGeef de taak een uitvoerbestemming
  5. 5
    VerbandMaak onderscheid tussen een gemiste en een mislukte uitvoering
  6. 6
    VoorbeeldZet het werk in een service
  7. 7
    VoorbeeldZet de tijd in de bijbehorende timer
  8. 8
    UitlegLaad wijzigingen en schakel de planning in
  9. 9
    UitdagingControleer zowel het resultaat als de volgende tijd
  10. 10
    UitlegTel zo nodig tijd vanaf een gebeurtenis
  11. 11
    UitdagingKies voor inhalen na uitval
  12. 12
    SamenvattingBekijk de planning en de taak afzonderlijk

Shellscripts: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Lees en voer kleine Bash-scripts uit10 Oefenvragen

Vraag 1 van 10

Een script gebruikt de Bash-syntaxis [[ ... ]], maar de eerste regel is #!/bin/sh. Op deze machine is sh gelijk aan dash. Welke eerste regel kiest de bedoelde interpreter?
  1. #!/bin/sh bash
  2. # /bin/bash
  3. #!/bin/bash
  4. #!/usr/bin/env sh
Toon antwoordVerberg antwoord
Antwoord: C
#!/bin/bash geeft Linux opdracht Bash te gebruiken als het bestand wordt uitgevoerd. De huidige shebang kiest dash, dat [[ ... ]] niet ondersteunt. Het woord “bash” toevoegen na /bin/sh zou nog steeds sh starten.

Vraag 2 van 10

Een script is leesbaar voor de eigenaar maar heeft geen uitvoerrecht. Hoe kan de eigenaar de Bash-commando's uitvoeren zonder dat recht te wijzigen?
  1. ./audit.sh
  2. bash audit.sh
  3. chmod u-x audit.sh
  4. source bash audit.sh
Toon antwoordVerberg antwoord
Antwoord: B
bash audit.sh start de interpreter en vraagt die het bestand te lezen, zodat uitvoerrecht op het script niet nodig is. ./audit.sh probeert het bestand direct uit te voeren en heeft dat recht dus nodig. Een bestand inlezen zou de commando's in de huidige shell uitvoeren, maar source bash audit.sh noemt het verkeerde bestand.

Vraag 3 van 10

Welke argumenten maakt printf '<%s>\n' "$label" op als label="west side"?
  1. Eén argument: west side.
  2. Twee argumenten: west en side.
  3. Eén argument: de letterlijke tekst $label.
  4. Eén argument: de letterlijke tekst "west side".
Toon antwoordVerberg antwoord
Antwoord: A
De expansie tussen dubbele aanhalingstekens levert de opgeslagen waarde als één argument, inclusief de spatie erin. De shell verwijdert de aanhalingstekens die groeperen voordat printf de waarde ontvangt. Een niet-afgeschermde expansie zou twee woorden opleveren; enkele aanhalingstekens rond die expansie zouden de letterlijke tekst $label opleveren.

Vraag 4 van 10

Een script stelt file="shift notes.txt" in. Hoe moet het dat ene bestand naar de bestaande directory saved kopiëren?
  1. cp '$file' saved/
  2. cp $file saved/
  3. cp "file" saved/
  4. cp "$file" saved/
Toon antwoordVerberg antwoord
Antwoord: D
Dubbele aanhalingstekens laten de variabele expanderen en houden de spatie binnen één padargument. Niet-afgeschermde $file wordt gesplitst in “shift” en “notes.txt”, zodat cp twee bronnamen ontvangt. Enkele aanhalingstekens behouden de tekens $file letterlijk en vervangen die niet door het opgeslagen pad.

Vraag 5 van 10

Een commando is zojuist mislukt met status 7. Welke toekenning bewaart dat resultaat onmiddellijk voor later gebruik?
  1. result=$#
  2. result=$?
  3. result=$!
  4. result=0
Toon antwoordVerberg antwoord
Antwoord: B
$? bevat de afsluitstatus van het meest recente commando, dus de onmiddellijke toekenning slaat 7 op. $# telt daarentegen positionele argumenten en kan het mislukte commando niet beschrijven. Voer geen ander commando uit voordat je het resultaat opslaat, want een nieuw commando zou de status vervangen die je wilt bewaren.

Vraag 6 van 10

Het pad archive bestaat en is een directory. Wat zijn de resultaten van [ -f archive ] en [ -d archive ], in die volgorde?
  1. Waar, daarna waar.
  2. Waar, daarna onwaar.
  3. Onwaar, daarna waar.
  4. Onwaar, daarna onwaar.
Toon antwoordVerberg antwoord
Antwoord: C
-f vereist een bestaand gewoon bestand, terwijl -d een bestaande directory vereist. De directory slaagt daarom niet voor de eerste test en wel voor de tweede. Alleen bestaan maakt niet beide tests waar: -e zou algemeen bestaan testen zonder een van deze specifieke typen te vereisen.

Vraag 7 van 10

Wat toont deze code?

used=14
limit=20
percent=$(( used * 100 / limit ))
if [ "$percent" -ge 60 ]; then
  used=$(( used + 2 ))
elif [ "$percent" -ge 70 ]; then
  used=$(( used + 5 ))
fi
echo "$used"
  1. 16
  2. 19
  3. 21
  4. 14
Toon antwoordVerberg antwoord
Antwoord: A
Het berekende percentage is 70, dus de eerste voorwaarde slaagt en telt 2 op bij used, wat 16 oplevert. Bash slaat daarna de elif-vertakking over, ook al zou die grenswaarde eveneens overeenkomen. Wie 5 optelt of beide wijzigingen toepast, ziet over het hoofd dat een if-reeks alleen de eerste geslaagde vertakking kiest.

Vraag 8 van 10

Een script wordt aangeroepen met ./label.sh "East Wing" report.txt. Wat zijn $# en $2?
  1. 3 en Wing.
  2. 2 en East Wing.
  3. 3 en report.txt.
  4. 2 en report.txt.
Toon antwoordVerberg antwoord
Antwoord: D
De afgeschermde woorden “East Wing” vormen één argument en report.txt is het tweede. $# is daarom 2 en $2 is report.txt. De scriptnaam hoort bij $0 en telt niet mee; als je de twee woorden binnen de afgeschermde naam afzonderlijk telt, kom je ten onrechte op drie argumenten.

Vraag 9 van 10

Een niet-interactief Bash-script gebruikt dir=${1:-/srv/logs}. Het wordt aangeroepen met één argument: een lege tekenreeks tussen aanhalingstekens. Welke waarde wordt toegekend?
  1. Een lege tekenreeks.
  2. De letterlijke tekst ${1}.
  3. /srv/logs
  4. Het script stopt met een fout.
Toon antwoordVerberg antwoord
Antwoord: C
De expansie met :- kiest de standaardwaarde als de parameter niet is ingesteld of leeg is, dus een expliciet leeg eerste argument gebruikt /srv/logs. Het argument bestaat nog steeds in de positionele lijst, maar de lege waarde voldoet aan de voorwaarde voor de standaardwaarde. De vorm :? zou bij die invoer in plaats daarvan een fout melden.

Vraag 10 van 10

Welke planning geeft 25 4 * * * /home/rae/bin/audit.sh aan in een persoonlijke crontab?
  1. Elke dag om 04.25 uur.
  2. Elke dag om 25:04 uur.
  3. Elk uur op minuut 4.
  4. Op de 4e dag om 00.25 uur.
Toon antwoordVerberg antwoord
Antwoord: A
Het eerste veld is de minuut, 25, en het tweede is het uur, 4. De overige sterretjes staan elke datum, maand en weekdag toe, wat een dagelijkse uitvoering om 04.25 uur oplevert. Als je minuut en uur omwisselt, krijg je een ongeldig uur van 25; het veld voor de dag van de maand is het derde veld, niet het tweede.
Set 2: Volg waarden, records en planningen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een direct uitgevoerd script meldt /bin/bash^M: bad interpreter, maar /bin/bash bestaat. Welke wijziging in het bestand verhelpt het aangeduide probleem?
  1. Verander de scriptextensie van .sh in .bash.
  2. Verplaats het script naar een directory op PATH.
  3. Voeg uitvoerrecht voor de eigenaar toe aan het script.
  4. Zet het script om naar Unix-regeleinden.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Hoe ken je de tekst “North Hall” toe aan een Bash-variabele met de naam site?
  1. site="North Hall"
  2. site = "North Hall"
  3. $site="North Hall"
  4. site=North Hall
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Welke waarde kent left=$(( 29 % 6 )) toe?
  1. 4
  2. 4.83
  3. 5
  4. 1
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een script mist een afsluitende done. Welk commando kan dat syntaxisprobleem detecteren zonder het script uit te voeren?
  1. bash -x batch.sh
  2. bash -n batch.sh
  3. bash batch.sh
  4. source ./batch.sh
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat zijn de resultaten van [ 06 = 6 ] en [ 06 -eq 6 ], in die volgorde?
  1. Waar, daarna onwaar.
  2. Waar, daarna waar.
  3. Onwaar, daarna waar.
  4. Onwaar, daarna onwaar.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een directory bevat a.csv en late batch.csv, beide gewone bestanden. Welke waarden worden gebruikt in for f in *.csv; do echo "$f"; done?
  1. Twee items: a.csv en late batch.csv.
  2. Drie items: a.csv, late en batch.csv.
  3. Eén item: het letterlijke patroon *.csv.
  4. Eén item: a.csv late batch.csv.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een bestand bevat oak, een nieuweregelteken en daarna elm zonder afsluitend nieuweregelteken. Welke telling wordt getoond?

count=0
while IFS= read -r line; do
  count=$(( count + 1 ))
done < trees.txt
echo "$count"
  1. 0
  2. 2
  3. 3
  4. 1
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Na de aanroep ./task.sh -v "blue room" output.txt voert het script shift uit. Wat zijn $1 en $# nu?
  1. -v en 2.
  2. blue room en 2.
  3. blue en 3.
  4. output.txt en 1.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Hoe vaak per dag wordt */25 10-12 * * * uitgevoerd en wanneer is de laatste uitvoering?
  1. 6 keer; de laatste om 12.25 uur.
  2. 8 keer; de laatste om 12.55 uur.
  3. 9 keer; de laatste om 12.50 uur.
  4. 9 keer; de laatste om 13.00 uur.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Welke service wordt bij de standaardkoppeling van units geactiveerd door inventory.timer?
  1. inventory.service
  2. timer.service
  3. inventory.timer.service
  4. inventory.target
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Volg gegevens door een volledig script10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een Bash-terminal begint met zone=west. Het bestand settings.sh bevat alleen zone=east. De terminal voert bash settings.sh uit, daarna source ./settings.sh en daarna bash -c 'echo "${zone:-unset}"'. De variabele is nooit geëxporteerd. Wat toont het laatste commando?
  1. east
  2. unset
  3. west
  4. Een lege regel.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Wat toont echo "${name}_ready" met name=archive?
  1. name_ready
  2. archive
  3. Een lege regel.
  4. archive_ready
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een script slaat completed=18 en total=32 op. Welk resultaat als geheel getal levert $(( completed * 100 / total )) op?
  1. 56
  2. 0
  3. 57
  4. 56.25
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Het bestand absent.log bestaat niet. Welke afsluitstatus bereikt de aanroeper?

#!/bin/bash
set -o pipefail
grep NOTICE absent.log | wc -l
status=$?
echo "Count ended"
exit "$status"
  1. 0
  2. 1
  3. 2
  4. 127
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat toont dit script?

set -e
false || echo "Handled"
echo "Next"
  1. Alleen Handled.
  2. Alleen Next.
  3. Handled, daarna Next.
  4. Er wordt niets getoond.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Waarom moet *) in een case-blok na de patronen voor benoemde acties staan?
  1. Het komt met elke waarde overeen en zou latere vertakkingen verbergen.
  2. Het komt met geen waarde overeen voordat een benoemd patroon is mislukt.
  3. Het herhaalt de vorige vertakking voor waarden zonder overeenkomst.
  4. Het geldt alleen voor bestandsnamen in de huidige directory.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

De huidige directory bevat alleen de gewone bestanden draft one.jpeg, final.jpeg en notes.txt. Wat is de uitvoer?

count=0
for f in *.jpeg; do
  [ "$f" = final.jpeg ] && continue
  echo "${f%.jpeg}.jpg"
  count=$(( count + 1 ))
done
echo "$count"
  1. draft.jpg, daarna one.jpg, daarna 2.
  2. draft one.jpg, daarna final.jpg, daarna 2.
  3. draft one.jpeg.jpg, daarna 1.
  4. draft one.jpg, daarna 1.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een script voert until [ -f /tmp/upload.ready ]; do sleep 3; done uit. Het gewone bestand bestaat al voordat de lus begint. Hoe vaak wordt het luslichaam uitgevoerd?
  1. Precies één keer.
  2. Nul keer.
  3. Eindeloos.
  4. Tot het wordt verwijderd.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een script voor verwerking in batches begint met status=0. Ongeldige invoer stelt status=1 in en latere invoer slaagt. Welke afsluiting meldt dat het verzoek onvolledig was?
  1. Stel na succes status=0 in en gebruik exit "$status".
  2. Behoud status=1 en eindig met een geslaagde echo.
  3. Stel status=0 in en toon een fout op standaarduitvoer.
  4. Behoud status=1 en gebruik exit "$status".
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Er zijn nieuwe systeemtimer- en servicebestanden geschreven. Welk commando laat systemd hun definities opnieuw lezen voordat de timer wordt ingeschakeld?
  1. sudo systemctl daemon-reload
  2. sudo systemctl start report.service
  3. sudo systemctl list-timers
  4. sudo journalctl -u report.service
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Onderzoek invoer, besturingsstroom en uitval10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een scriptbestand wordt hernoemd van weekly.sh naar weekly, met ongewijzigde inhoud en rechten. Wat doet het verdwijnen van de extensie met de keuze van de interpreter op basis van de shebang door Linux?
  1. Linux kiest daardoor de huidige loginshell.
  2. Linux kiest daardoor standaard /bin/sh.
  3. De keuze van de interpreter blijft ongewijzigd.
  4. Linux kan de shebang daardoor niet lezen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een Bash-ouderproces voert export REGION=north uit en start daarna een script dat REGION=south toekent en eindigt. Welke waarde blijft in het ouderproces staan?
  1. north
  2. south
  3. Een lege waarde.
  4. De variabele wordt niet-ingesteld.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

In een verder lege directory stelt een script pattern="*.txt" in. Welk argument ontvangt touch "$pattern"?
  1. Geen pad, omdat niets overeenkomt.
  2. Eén pad voor elk bestaand tekstbestand.
  3. Het letterlijke pad "*.txt" met aanhalingstekens.
  4. Het letterlijke pad *.txt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Wat gebeurt er in dit niet-interactieve script?

set -eu
dest=
if [ -z "$dest" ]; then
  dest=${2:-/srv/archive}
fi
echo "$dest"

Het script ontvangt slechts één argument, input.txt.

  1. Het stopt omdat aan dest lege tekst is toegekend.
  2. Het toont /srv/archive en slaagt.
  3. Het stopt omdat het tweede argument ontbreekt.
  4. Het toont input.txt en slaagt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

De variabele count bevat 10 en de huidige directory is schrijfbaar en bevat geen bestand met de naam 4. Wat gebeurt er?

if [ "$count" > 4 ]; then
  echo "High"
else
  echo "Low"
fi
  1. Het maakt geen bestand en toont High.
  2. Het maakt 4 en toont Low.
  3. Het maakt geen bestand en toont Low.
  4. Het maakt 4 en toont High.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een script vergelijkt met case "$value" in [0-9]*) echo "Match" ;; *) echo "No" ;; esac. Wat gebeurt er bij value=8draft?
  1. Het toont Match.
  2. Het toont No.
  3. Het mislukt omdat de waarde letters bevat.
  4. Het toont zowel Match als No.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Wat wordt getoond?

i=0
total=0
while [ "$i" -lt 4 ]; do
  i=$(( i + 1 ))
  [ "$i" -eq 2 ] && continue
  total=$(( total + i ))
  [ "$total" -gt 5 ] && break
done
echo "$i:$total"
  1. 4:10
  2. 3:4
  3. 4:8
  4. 2:1
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een script ontvangt achtereenvolgens -v, een lege tekenreeks tussen aanhalingstekens en "red room". Het voert shift uit en daarna for arg in "$@"; do echo "<$arg>"; done. Wat wordt getoond?
  1. <red>, daarna <room>.
  2. <>, daarna <red room>.
  3. Alleen <red room>.
  4. <-v>, daarna <>, daarna <red room>.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Welke datums kiest 0 11 9 * 2 /home/rae/bin/check.sh in gewone cron?
  1. Alleen dinsdagen die op de 9e vallen, om 11.00 uur.
  2. Elke dinsdag en elke 9e, om 11.00 uur.
  3. Elke dinsdag in september, om 11.00 uur.
  4. Alleen de tweede dinsdag, om 11.09 uur.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een ingeschakelde kalendertimer heeft Persistent=true. Drie dagelijkse activeringen verstrijken terwijl de computer uitstaat. Welke inhaalactie regelt de timer bij heractivering?
  1. Eén serviceactivering voor het gemiste kalenderwerk.
  2. Drie activeringen, één voor elke gemiste dagelijkse uitvoering.
  3. Geen activering tot het volgende toekomstige kalendertijdstip.
  4. Voortdurende activeringen totdat de machine uitschakelt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Combineer afscherming, foutcontroles en herbruikbare invoer10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een Bash-terminal staat in /home/rae, met PATH /home/rae/bin:/usr/local/bin:/usr/bin:/bin. In beide bin-mappen en de huidige directory staan uitvoerbare Bash-scripts met de naam scan. Elk bevat alleen een Bash-shebang en cd /srv/cache; die directory bestaat en is toegankelijk. Welk bestand voert het eerste commando uit en welke paden worden getoond?

scan
pwd
source ./scan
pwd
  1. /usr/local/bin/scan; daarna /home/rae en /srv/cache.
  2. /home/rae/bin/scan; daarna /home/rae en /srv/cache.
  3. ./scan; daarna /srv/cache en /srv/cache.
  4. /home/rae/bin/scan; daarna /srv/cache en /srv/cache.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een directory bevat alleen a.txt en b.txt. Hoeveel gegevensargumenten maakt printf '<%s>\n' $value op na value="*.txt spare", met de standaardinstellingen van Bash voor splitsing en bestandsnaamexpansie?
  1. Eén: de letterlijke tekst *.txt spare.
  2. Twee: de letterlijke tekst *.txt en spare.
  3. Drie: a.txt, b.txt, spare.
  4. Twee: a.txt spare en b.txt spare.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een commando toont ready op standaarduitvoer en warning op standaardfoutuitvoer en slaagt daarna. Wat wordt opgeslagen door message=$(the_command)?
  1. Alleen ready.
  2. Alleen warning.
  3. Beide regels op volgorde.
  4. De status 0 van het commando.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Welke afsluitstatus bereikt de aanroeper?

#!/bin/bash
false
saved=$?
true && echo "Handled"
exit $(( saved + 2 ))
  1. 0
  2. 1
  3. 2
  4. 3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een script gebruikt set -u en heeft al folder="" toegekend. Het moet met een bruikbare foutmelding stoppen voordat het een ontbrekende of lege map gebruikt. Welke expansie biedt die controle?
  1. ${folder:?Folder required}
  2. ${folder:-Folder required}
  3. "$folder"
  4. ${folder}
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Welke test controleert of "$text" een lengte anders dan nul heeft?
  1. [ -z "$text" ]
  2. [ -s "$text" ]
  3. [ -n "$text" ]
  4. [ -e "$text" ]
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Welke waarden toont for i in {1..$limit}; do echo "$i"; done bij limit=3 onder gewone Bash-expansie?
  1. Drie waarden: 1, 2, 3.
  2. Eén waarde: de letterlijke tekst {1..$limit}.
  3. Geen waarden, omdat de lijst leeg is.
  4. Eén waarde: de letterlijke tekst {1..3}.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Welke telling wordt getoond bij het standaardgedrag van Bash voor pijplijnen? Het bestand bevat drie regels die elk eindigen met een nieuweregelteken.

count=5
cat tasks.txt | while IFS= read -r line; do
  count=$(( count + 1 ))
done
count=$(( count + 2 ))
echo "$count"
  1. 10
  2. 7
  3. 8
  4. 5
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een script verwerkt zijn invoer met deze code en vereist daarna precies twee bestandsargumenten. Hoeveel argumenten blijven over na de aanroep ./copy.sh -v -- "early notes.txt" -final.txt en wat moet daarna gebeuren?

while [ "$#" -gt 0 ]; do
  case "$1" in
    -v) verbose=1; shift ;;
    --) shift; break ;;
    -*) echo "Unknown option" >&2; exit 2 ;;
    *) break ;;
  esac
done
  1. Drie blijven over; wijs de extra markering voor het einde van opties af.
  2. Twee blijven over; wijs -final.txt af als onbekende optie.
  3. Twee blijven over; controleer beide paden en probeer te kopiëren.
  4. Eén blijft over; gebruik een standaardwaarde voor de ontbrekende bestemming.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een gepland script gebruikt Bash-syntaxis en is uitvoerbaar met een Bash-shebang. Het werkt in de terminal, maar cron meldt dat een hulpcommando ontbreekt. Het hulpprogramma staat in /home/rae/.local/bin. Welke wijziging verhelpt het waarschijnlijke verschil?
  1. Verander de Bash-shebang van het script in /bin/sh.
  2. Voeg een gebruikersnaamveld toe aan de persoonlijke crontab.
  3. Maak het uitvoerbare script een tweede keer uitvoerbaar.
  4. Gebruik het absolute pad van het hulpprogramma of stel PATH voor cron in.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

76 Kernbegrippen, elk met een definitie

A

Aantal argumenten
Het aantal argumenten is het aantal opgegeven positionele argumenten, beschikbaar als $#, zonder de aanroepnaam mee te tellen.
Het aantal argumenten is 2 voor ./greet.sh Ana "Lee Kim" omdat de afgeschermde naam één argument is.
Accolade-expansie
Accolade-expansie maakt een vaste lijst uit een notatie zoals {1..5} voordat Bash variabele-expansie op het commando toepast.
Accolade-expansie kan {1..$n} niet omzetten in een bereik op basis van de waarde die in n is opgeslagen.
Afscherming
Afscherming bepaalt hoe Bash speciale tekens interpreteert en houdt bedoelde tekst bij elkaar terwijl het commandoargumenten voorbereidt.
Door "$file" af te schermen blijft “monthly report.txt” één argument bij het kopiëren van het bestand.
Afsluitstatus
Een afsluitstatus is een commandoresultaat als geheel getal van 0 tot en met 255; nul betekent succes en andere waarden melden gedocumenteerde uitkomsten.
De afsluitstatus van grep -q maakt onderscheid tussen een overeenkomst, geen overeenkomst en een probleem bij het lezen van de invoer.
Afsluitstatus van een pijplijn
De afsluitstatus van een pijplijn is het resultaat van een commandopijplijn en wordt normaal gesproken overgenomen van het laatste commando, tenzij pipefail die regel verandert.
De afsluitstatus van een pijplijn kan nul zijn als grep mislukt maar de daaropvolgende wc succesvol geen invoer telt.
Allesomvattend patroon
Een allesomvattend patroon is een patroon dat met elke resterende waarde overeenkomt, meestal * aan het einde van een Bash-case-blok.
Het allesomvattende patroon *) meldt onbekende commando's nadat de benoemde subcommando's zijn gecontroleerd.
Anacron
Anacron voert periodieke taken uit die tijdens uitval zijn gemist en verwerkt na het opstarten gewoonlijk dagelijkse, wekelijkse en maandelijkse taken.
Anacron kan een dagelijkse taak inhalen op een laptop die op het gebruikelijke geplande tijdstip uitstond.

B

Bash
Bash is de Bourne Again Shell, een commando-interpreter die op Linux-systemen interactief en voor het uitvoeren van scripts wordt gebruikt.
Een script dat [[ ... ]] gebruikt, kiest Bash in de shebang zodat de syntaxis van de testconstructie wordt begrepen.
Bestandseinde
Het bestandseinde is het punt waarop een invoerstroom geen gegevens meer heeft; Bash read meldt mislukking als het dit punt bereikt.
Bij het bestandseinde kan een laatste record zonder nieuweregelteken worden opgeslagen, hoewel read mislukking meldt.
Bestandsnaamexpansie
Bestandsnaamexpansie vervangt een niet-afgeschermd bestandsnaampatroon door overeenkomende paden; Bash behoudt een patroon zonder overeenkomsten normaal gesproken als letterlijke tekst.
Bestandsnaamexpansie expandeert *.log naar afzonderlijke overeenkomende bestandsnamen voordat een for-lus begint.
Bestandstest
Een bestandstest controleert of een pad bestaat en wat het type of de toegangseigenschappen zijn, en geeft een status terug die een voorwaarde kan gebruiken.
De bestandstest [ -d "$src" ] accepteert een brondirectory maar wijst een gewoon bestand af.
break
Het commando break verlaat de huidige lus onmiddellijk, zodat de uitvoering verdergaat na het afsluitende commando van die lus.
Een menulus gebruikt break als de gebruiker “q” invoert en er geen menukeuzes meer moeten worden gelezen.

C

case
Een case-blok vergelijkt één waarde op volgorde met patronen en voert de commando's uit die bij de eerste overeenkomende vertakking horen.
Een case-blok kan “start”, “stop” en een commando zonder overeenkomst in afzonderlijke vertakkingen afhandelen.
Commandosubstitutie
Commandosubstitutie voert een commando uit en voegt de standaarduitvoer ervan in via de vorm $(command), waarbij nieuweregeltekens aan het einde worden verwijderd.
Commandosubstitutie in today=$(date +%F) vangt een datum op voor gebruik in de naam van een back-upbestand.
Commentaar
Commentaar is verklarende tekst die de shell negeert en die begint met # aan het begin van een woord buiten afgeschermde tekst.
Het commentaar # Keep a copy for recovery legt uit waarom de volgende bestandskopie nodig is.
continue
Het commando continue slaat de resterende commando's in de huidige lusdoorgang over en gaat verder met de volgende doorgang of voorwaardecontrole.
Een bestandslus gebruikt continue na een mislukte controle, zodat het verwerkingscommando nooit een ontbrekend pad ontvangt.
cron
cron is een planningsservice op de achtergrond die commando's start wanneer de tijdvelden in de crontab overeenkomen met de huidige tijd.
Een cron-taak kan op elke werkdag om 06.15 uur een uitvoerbaar rapportscript draaien zonder open terminal.
Crontab
Een crontab is een planning van cron-vermeldingen, met vijf tijdvelden en een commando op elke taakregel van een persoonlijke tabel.
Het commando crontab -l toont de crontab van de huidige gebruiker, zodat je de planningen kunt bekijken.

D

Doorgeven van argumenten
Doorgeven van argumenten geeft waarden die een script heeft ontvangen door aan een ander commando, meestal met "$@" om elke grens te behouden.
Door argumenten met "$@" door te geven blijven een lege invoer en een naam met meerdere woorden afzonderlijke argumenten.
Dubbele aanhalingstekens
Dubbele aanhalingstekens behouden spaties en jokertekens in een waarde en staan tegelijk variabele-expansie, commandosubstitutie en rekenkundige expansie toe.
Dubbele aanhalingstekens in echo "Home: $HOME *" laten het pad naar de homedirectory expanderen en behouden het sterretje.

E

elif
Het sleutelwoord elif leidt een andere voorwaarde in een if-blok in, die alleen wordt getest als alle eerdere voorwaarden in dat blok zijn mislukt.
Een elif-test voor 75% gebruik wordt pas uitgevoerd nadat de eerdere test voor minstens 90% is mislukt.
Enkele aanhalingstekens
Enkele aanhalingstekens omsluiten letterlijke tekst en voorkomen expansie van variabelen, commando's en jokertekens binnen het afgeschermde deel.
Enkele aanhalingstekens zorgen ervoor dat echo '$HOME' de tekens “$HOME” toont in plaats van een pad naar de homedirectory.
errexit
errexit is de Bash-optie set -e, die stopt bij niet-afgehandelde mislukkingen en daarbij bepaalde situaties toestaat waarin een commandostatus wordt getest.
De optie errexit laat een mislukte if-voorwaarde de else-vertakking kiezen in plaats van het script te beëindigen.
exit
Het ingebouwde commando exit beëindigt de shell of het script en meldt een opgegeven status, of de status van het vorige commando als geen getal is opgegeven.
Een script gebruikt exit 2 na verkeerd gebruik, zodat de aanroeper een resultaat krijgt dat mislukking aangeeft.
Exporteren
Exporteren markeert een shellvariabele voor opname in de omgeving die wordt overgeërfd door programma's die die shell daarna start.
Door BACKUP_DIR te exporteren kan een nieuw gestart back-upscript de ingestelde bestemming lezen.

F

for-lus
Een for-lus herhaalt commando's voor elk item in een lijst en kent dat item toe aan de lusvariabele voordat het luslichaam wordt uitgevoerd.
Een for-lus over web1 web2 db1 voert het luslichaam één keer uit voor elk van de drie hostnamen.
Foutvlag
Een foutvlag is een opgeslagen waarde die een mislukt deel van een grotere taak onthoudt, zodat de uiteindelijke status anders dan nul blijft.
Een foutvlag blijft ingesteld na een ontbrekend bestand, ook als het script daarna een ander bestand succesvol telt.

G

Gebruikersbeheer zonder aanmeldsessie
Gebruikersbeheer zonder aanmeldsessie laat de systemd-gebruikersbeheerder beschikbaar blijven zonder actieve aanmeldsessie, zodat gebruikersservices en -timers kunnen draaien.
Een beheerder schakelt gebruikersbeheer zonder aanmeldsessie in als een geplande taak van een gebruiker zonder aanmelding moet doorgaan.
Gebruiksinstructie
Een gebruiksinstructie toont hoe je een commando aanroept, noemt verplichte argumenten en markeert optionele of herhaalbare invoer.
De gebruiksinstructie “Usage: count.sh FILE...” geeft aan dat bestandsinvoer kan worden herhaald.
Geheeltallige deling
Geheeltallige deling berekent een quotiënt als geheel getal en gooit het breukdeel weg in plaats van een decimaal resultaat te geven.
Door geheeltallige deling levert $(( 7 / 2 )) de waarde 3 op, hoewel het exacte quotiënt 3,5 is.

I

IFS
IFS is de variabele voor het interne veldscheidingsteken van de shell; als je die voor read leeg instelt, blijft witruimte aan het begin en einde behouden.
Met IFS= read -r line behoud je spaties aan de randen van elk record dat uit het invoerbestand wordt gelezen.
Inlezen in de huidige shell
Inlezen in de huidige shell betekent de commando's van een bestand in de huidige shell lezen, zodat de toekenningen en directorywijzigingen die shell beïnvloeden.
Door ./settings.sh in te lezen laad je de variabeletoekenningen direct in de open Bash-sessie.
Interpreter
Een interpreter is een programma dat instructies leest en uitvoert die zijn geschreven in een taal die het begrijpt.
De interpreter die door #!/usr/bin/python3 wordt gekozen, leest Python-code in plaats van Bash-commando's.
Iteratie
Een iteratie is één doorgang door een luslichaam, waarbij het huidige lijstitem of de huidige waarden worden gebruikt voordat de volgende doorgang begint.
Eén iteratie van een bestandslus verwerkt de ene naam “beach day.jpeg” voordat de lus verdergaat.

K

Kalendertimer
Een kalendertimer vergelijkt datums en kloktijden via OnCalendar en kan gemist werk inhalen als Persistent op true staat.
Een kalendertimer met OnCalendar=Mon..Fri 09:00 kiest werkdagen om 09.00 uur.
Kindproces
Een kindproces is een proces dat door een ander proces is gestart en een eigen toestand en overgeërfde omgevingswaarden heeft.
Een script in een kindproces kan van directory veranderen zonder de terminal te verplaatsen die het startte.
Kortsluitevaluatie
Kortsluitevaluatie gebruikt de status van een commando om te bepalen of het volgende commando in een lijst met && of || wordt uitgevoerd.
Kortsluitevaluatie in cd /data || exit 1 stopt afhankelijke commando's na een mislukte directorywijziging.

L

Logboek
Het systemd-logboek slaat service-uitvoer en foutmeldingen op, zodat je gepland werk na uitvoering kunt bekijken.
De logboekopvraag journalctl -u backup.service toont meldingen van de back-uptaak.

M

Minimale omgeving
Een minimale omgeving biedt slechts een kleine verzameling procesinstellingen, zonder de variabelen en opstartbestanden van een interactieve sessie.
In de minimale omgeving van cron kan een persoonlijke bin-directory ontbreken die in de terminal wel beschikbaar was.
Monotone timer
Een monotone timer meet de verstreken tijd vanaf een gebeurtenis, zoals het opstarten of de laatste serviceactivering, in plaats van een kalendertijdstip te vergelijken.
Een monotone timer kan OnBootSec en OnUnitActiveSec combineren voor een eerste uitvoering en latere tussenpozen.

N

Negatie
Negatie keert succes en mislukking van een commando of test om, zodat een voorwaarde gevallen kan selecteren waarin de oorspronkelijke voorwaarde onwaar is.
Negatie in [ ! -d "$p" ] accepteert zowel een gewoon bestand als een pad dat niet bestaat.
nounset
nounset is de Bash-optie set -u, die expansie van een niet-ingestelde variabele in een niet-interactief script als fout behandelt.
Met nounset ingeschakeld kan een verkeerd gespelde variabelenaam een script stoppen voordat het een leeg pad gebruikt.
Numerieke vergelijking
Een numerieke vergelijking vergelijkt gehele waarden met operators zoals -eq en -gt, onafhankelijk van hun tekstlengte.
De numerieke vergelijking [ "$count" -ge 8 ] slaagt bij een opgeslagen telling van 12.

O

Omgevingsvariabele
Een omgevingsvariabele is een benoemde waarde in de omgeving die van een proces wordt gekopieerd naar programma's die het start.
De omgevingsvariabele HOME levert een pad naar de homedirectory aan veel commando's die een shell start.
Optie
Een optie is invoer op de commandoregel die het gedrag verandert, vaak geschreven met een koppelteken vooraan en verwerkt vóór gewone argumenten.
De optie -v kan extra meldingen inschakelen voordat het script de resterende bestandsnamen verwerkt.

P

PATH
PATH is de omgevingswaarde met een lijst, gescheiden door dubbele punten, van directory's waarin naar commandonamen zonder schuine streep wordt gezocht.
De shell doorzoekt PATH voor job.sh, maar volgt het expliciete pad in de huidige directory bij ./job.sh.
pipefail
pipefail is een Bash-optie die een pijplijn de status van het meest rechtse mislukte commando laat teruggeven, of nul wanneer elk commando slaagt.
Met pipefail ingeschakeld kan ontbrekende invoer die door grep wordt gemeld de hele pijplijn laten mislukken.
Positionele parameter
Een positionele parameter bevat een argument dat aan een script is opgegeven, genummerd vanaf $1, waarbij voor posities na negen accolades vereist zijn.
De positionele parameter ${10} haalt het tiende argument op zonder een nul achter $1 toe te voegen.

R

read
Het ingebouwde Bash-commando read leest een regel van standaardinvoer en slaat de velden ervan op in variabelen die in het commando zijn genoemd.
Met read -r -p "Name: " name vraag je om een naam en behoud je backslashes in de ingevoerde tekst.
Regeleinde
Een regeleinde markeert het einde van een tekstregel; Unix gebruikt een nieuweregelteken, terwijl Windows daar gewoonlijk een carriage-returnteken voor zet.
Een Windows-regeleinde in een shebang kan ertoe leiden dat Linux naar een interpreterpad zoekt dat eindigt op ^M.
Rekenkundige expansie
Rekenkundige expansie berekent een expressie met gehele getallen binnen $(( ... )) en voegt de berekende waarde in het commando in.
Rekenkundige expansie verandert "$(( count + 1 ))" in de volgende tellerwaarde als geheel getal.
Rest
Een rest is het gehele deel dat overblijft na een deling met gehele getallen; Bash-rekenkunde verkrijgt die met de operator %.
De rest in $(( 17 % 5 )) is 2 omdat drie volledige groepen van vijf samen 15 gebruiken.

S

Service-unit
Een service-unit bepaalt welk werk systemd moet starten, zoals een eenmalig script dat met een absoluut ExecStart-pad is opgegeven.
De service-unit backup.service bepaalt het script dat door de bijbehorende back-uptimer wordt geactiveerd.
Shebang
Een shebang is de eerste regel die begint met #! en de interpreter aanwijst die Linux moet gebruiken om een script uit te voeren.
De shebang #!/bin/bash begint bij het eerste teken, vóór commentaar of een lege regel.
Shellscript
Een shellscript is een bestand met platte tekst met shellcommando's, opgeslagen zodat een interpreter die als herhaalbare taak kan uitvoeren.
Een shellscript kan een back-upmap maken, notities erin kopiëren en de opgeslagen kopie tonen.
shift
Het ingebouwde commando shift verwijdert voorste positionele parameters en hernummert de resterende parameters, waardoor het aantal argumenten afneemt.
Nadat shift -v heeft verwerkt en verwijderd, wordt het volgende commandoregelwoord $1 voor de optieverwerker.
Signaal- en gebeurtenisafhandeling
Signaal- en gebeurtenisafhandeling registreert een commando dat wordt uitgevoerd wanneer een gekozen signaal of shellgebeurtenis optreedt, zoals EXIT wanneer het Bash-proces eindigt.
Een EXIT-trap kan het tijdelijke bestand verwijderen waarvan het pad eerder in het script is opgeslagen.
Sleutelwoord voor een testconstructie
Een sleutelwoord voor een testconstructie, zoals [[ in Bash, begint een shelltestconstructie met eigen regels voor verwerking en patroonherkenning.
Het sleutelwoord voor een testconstructie [[ staat [[ $name == *.log ]] toe zonder woordsplitsing van de naam.
Standaardfoutuitvoer
Standaardfoutuitvoer is de uitvoerstroom voor foutmeldingen, afzonderlijk van standaarduitvoer zodat normale gegevens onafhankelijk kunnen worden omgeleid.
Een melding die met >&2 naar standaardfoutuitvoer wordt gestuurd, blijft zichtbaar als standaarduitvoer naar een bestand gaat.
Standaardwaarde
Een standaardwaarde levert optionele invoer als geen bruikbare waarde is opgegeven, zoals ${1:-/var/log} voor een ontbrekend of leeg argument.
Met een standaardwaarde kan een gepland rapport een standaarddirectory gebruiken zonder een persoon om invoer te vragen.
Stapgrootte in een cron-tijdveld
Een stapgrootte in een cron-tijdveld selecteert waarden met regelmatige tussenafstanden binnen een tijdveld en begint opnieuw binnen het bereik van dat veld in plaats van verstreken tijd te meten.
Een stapgrootte van */45 in het minutenveld kiest 0 en 45 en begint daarna bij 0 in het volgende uur.
Syntaxiscontrole
Een syntaxiscontrole leest een script om ongeldige shellstructuur te vinden zonder de commando's uit te voeren of hun werkelijke resultaten te testen.
Een syntaxiscontrole met bash -n detecteert een ontbrekende done voordat de lus commando's kan uitvoeren.

T

Tekenreeksvergelijking
Een tekenreeksvergelijking controleert tekst teken voor teken, zodat verschillende schrijfwijzen of voorloopnullen waarden ongelijk kunnen maken.
Een tekenreeksvergelijking behandelt “07” en “7” als verschillend, hoewel ze hetzelfde gehele getal voorstellen.
Teller
Een teller is een opgeslagen getal dat wordt bijgewerkt wanneer gebeurtenissen of lusdoorgangen plaatsvinden, meestal door één bij de vorige waarde op te tellen.
Een teller die met count=0 is geïnitialiseerd, kan één keer toenemen voor elke regel die een lus leest.
Timerunit
Een timerunit levert een systemd-planning die een andere unit activeert, normaal gesproken de service met dezelfde basisnaam.
Door de timerunit backup.timer in te schakelen stel je de planning voor de back-upservice vast.
Toekenning
Een toekenning slaat een waarde op onder een variabelenaam met name=value, zonder spaties rond het isgelijkteken.
De toekenning name="Lee Kim" houdt de twee woorden bij elkaar als één opgeslagen waarde.

U

Uitvoering traceren
Uitvoering traceren toont commando's na expansie terwijl Bash ze uitvoert, zodat de gebruikte waarden zichtbaar worden om fouten op te sporen.
Door de uitvoering te traceren met bash -x wordt een leeg bronargument zichtbaar dat aan een kopieercommando wordt doorgegeven.
Uitvoerrecht
Uitvoerrecht staat een gebruiker met de juiste rechten toe een bestand als programma te starten, waaronder een script waarvan de shebang de interpreter kiest.
Door uitvoerrecht toe te voegen met chmod u+x job.sh kan de eigenaar proberen ./job.sh uit te voeren.
until-lus
Een until-lus test een commando vóór elke doorgang en herhaalt het luslichaam totdat dat commando succes teruggeeft.
Een until-lus kan tussen controles pauzeren terwijl die wacht op een bestand dat aangeeft dat een export is voltooid.

V

Validatie
Validatie controleert of invoer aan de eisen van een script voldoet voordat afhankelijk werk begint, waaronder het aantal en de typen argumenten.
Validatie wijst een directory af als een telscript een gewoon bestand als invoer vereist.
Variabele
Een variabele is een benoemde waarde die door de shell wordt opgeslagen en wordt geëxpandeerd wanneer een commando de bij die naam horende waarde nodig heeft.
De variabele city slaat “Lisbon” op na city=Lisbon, zodat echo "$city" die kan tonen.
Variabele-expansie
Variabele-expansie vervangt een naam met een dollarteken ervoor door de opgeslagen waarde terwijl Bash een commando voorbereidt voor uitvoering.
Variabele-expansie verandert "${file}_old" in “report_old” als file de waarde “report” bevat.
Vertakking
Een vertakking is een groep commando's die door een voorwaarde of patroonovereenkomst wordt gekozen, zodat een script verschillende acties voor verschillende invoer heeft.
Een vertakking voor schijfgebruik met de hoogste grenswaarde moet vóór een overlappende waarschuwingsgrens staan.
Verwijderen van een achtervoegsel
Verwijderen van een achtervoegsel is een parameterexpansie die een overeenkomend achtervoegsel uit de waarde van een variabele verwijdert, zoals in ${f%.jpeg}.
Het verwijderen van een achtervoegsel verandert “lake.jpeg” in “lake”, zodat een hernoemcommando daarna “.jpg” kan toevoegen.

W

while-lus
Een while-lus test een commando vóór elke doorgang en herhaalt het luslichaam zolang dat commando succes teruggeeft.
Een while-lus die een bestand leest, eindigt als read het bestandseinde bereikt en mislukking meldt.
Woordsplitsing
Woordsplitsing verdeelt een niet-afgeschermde expansie in afzonderlijke woorden met behulp van scheidingstekens, normaal gesproken spaties, tabs en nieuweregeltekens.
Woordsplitsing verandert een niet-afgeschermde waarde “my report.txt” in twee argumenten voordat cp draait.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag