Zoeken op website

Hoe syntaxis uit te voeren De foutopsporingsmodus controleren in Shell-scripts


We zijn de reeks foutopsporing in shell-scripts begonnen met uitleg over de verschillende foutopsporingsopties en hoe u de foutopsporingsmodi voor shell-scripts kunt inschakelen.

Na het schrijven van uw shellscripts wordt aanbevolen dat we de syntaxis in de scripts praktisch controleren voordat we ze uitvoeren, in plaats van naar de uitvoer ervan te kijken om te bevestigen dat ze correct werken.

In dit deel van de serie zullen we bespreken hoe u de foutopsporingsmodus voor syntaxiscontrole kunt gebruiken. Onthoud dat we de verschillende foutopsporingsopties in het eerste deel van deze serie hebben uitgelegd en dat we ze hier zullen gebruiken om scriptfoutopsporing uit te voeren.

Uitgebreide foutopsporingsmodus inschakelen

Voordat we naar de primaire focus van deze handleiding gaan, verkennen we kort de uitgebreide modus. Het wordt mogelijk gemaakt door de -v debugging-optie, die de shell vertelt om alle regels in een script weer te geven terwijl ze worden gelezen.

Om te demonstreren hoe dit werkt, vindt u hieronder een voorbeeld van een shellscript waarmee u PNG-afbeeldingen batchgewijs naar JPG-indeling kunt converteren.

Typ (of kopieer en plak) het in een bestand.

#!/bin/bash
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"
done
exit 0

Sla het bestand vervolgens op en maak het script uitvoerbaar met behulp van de onderstaande opdracht:

chmod +x script.sh

We kunnen het script aanroepen en alle regels erin weergeven zoals ze door de shell worden gelezen, als volgt:

bash -v script.sh

Syntaxis inschakelen De foutopsporingsmodus controleren in Shell-scripts

Terugkomend op ons nadrukonderwerp: de -n activeert de syntaxiscontrolemodus. Het instrueert de shell om in principe alle opdrachten te lezen, maar voert ze niet uit, het (shell) onderzoekt alleen de gebruikte syntaxis.

Als er fouten in uw shellscript voorkomen, zal de shell de fouten op de terminal weergeven, anders wordt er niets weergegeven.

De syntaxis voor het activeren van syntaxiscontrole is als volgt:

bash -n script.sh

Omdat de syntaxis in het script correct is, geeft de bovenstaande opdracht geen uitvoer weer. Laten we daarom proberen het woord done te verwijderen dat de for-lus afsluit en kijken of er een fout wordt weergegeven:

Hieronder staat het aangepaste shell-script om png-afbeeldingen batchgewijs naar jpg-formaat te converteren dat een bug bevat.

#!/bin/bash
#script with a bug
#convert
for image in *.png; do
        convert  "$image"  "${image%.png}.jpg"
        echo "image $image converted to ${image%.png}.jpg"

exit 0

Sla het bestand op en voer het uit terwijl u de syntaxis controleert:

bash -n script.sh

Uit de bovenstaande uitvoer kunnen we zien dat er een syntaxisprobleem is met ons script. In de for-lus ontbreekt een afsluitend trefwoordwoord done. En de shell zocht ernaar tot aan het einde van het bestand en toen hij het eenmaal niet vond (klaar), printte de shell een syntaxisfout:

script.sh: line 11: syntax error: unexpected end of file

We kunnen net zo goed de uitgebreide modus en de syntaxiscontrolemodus combineren:

bash -vn script.sh

Als alternatief kunnen we syntaxiscontrole inschakelen door de eerste regel van het bovenstaande script te wijzigen, zoals in het volgende voorbeeld.

#!/bin/bash -n
#altering the first line of a script to enable syntax checking

#convert
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

exit 0

Sla het bestand op zoals voorheen en voer het uit terwijl u de syntaxis controleert:

./script.sh

script.sh: line 12: syntax error: unexpected end of file

Bovendien kunnen we de ingebouwde opdracht set shell gebruiken om de foutopsporingsmodus in het bovenstaande script in te schakelen.

In het onderstaande voorbeeld controleren we alleen de syntaxis van de for-lus in ons script.

#!/bin/bash
#using set shell built-in command to enable debugging
#convert

#enable debugging
set -n
for image in *.png; do
    convert  "$image"  "${image%.png}.jpg"
    echo "image $image converted to ${image%.png}.jpg"

#disable debugging
set +n
exit 0

Sla het bestand nogmaals op en roep het script aan:

./script.sh 

Samenvattend moeten we er altijd voor zorgen dat we onze shellscripts syntactisch controleren om eventuele fouten vast te leggen voordat we ze uitvoeren.

Als u vragen of feedback over deze handleiding wilt sturen, kunt u het onderstaande reactieformulier gebruiken. In het derde deel van deze serie gaan we over op het uitleggen en gebruiken van de foutopsporingsmodus voor shell-tracing.