Sådan udføres syntaks kontrol af fejlretningstilstand i shell-scripts


Vi startede shell-fejlfindingsserien ved at forklare de forskellige fejlfindingsmuligheder og hvordan man aktiverer fejlfindingsmetoder for shell-script.

Efter at have skrevet dine shell-scripts, anbefales det, at vi praktisk talt kontrollerer syntaksen i scripts, inden vi kører dem, i modsætning til at se på deres output for at bekræfte, at de fungerer korrekt.

I denne del af serien vil vi gennemgå, hvordan man bruger debugging-tilstand til syntaks-kontrol. Husk, at vi forklarede de forskellige fejlretningsindstillinger i den første del af denne serie, og her vil vi bruge dem til at udføre fejlfinding af script.

Før vi går til det primære fokus i denne vejledning, lad os kort undersøge den detaljerede tilstand. Det er aktiveret af indstillingen -v debugging, som beder skallen om at vise alle linjer i et script, mens de læses.

For at demonstrere, hvordan dette fungerer, er nedenfor et eksempel på et shell-script til batchkonvertering af PNG-billeder til JPG-format.

Skriv (eller kopier og indsæt) det i en fil.

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

Gem derefter filen, og gør scriptet eksekverbart ved hjælp af kommandoen nedenfor:

$ chmod +x script.sh

Vi kan påkalde scriptet og vise alle linjerne i det, når de læses af skallen sådan:

$ bash -v script.sh

Når vi vender tilbage til vores vægtemne, aktiverer -n syntaks-kontroltilstand. Det instruerer skallen til grundlæggende at læse alle kommandoer, men udfører dem ikke, den (shell) undersøger kun den anvendte syntaks.

Hvis der er fejl i dit shell-script, udfører shell fejlene på terminalen, ellers viser det intet.

Syntaksen til aktivering af syntakskontrol er som følger:

$ bash -n script.sh

Da syntaksen i scriptet er korrekt, viser kommandoen ovenfor ikke nogen output. Lad os derfor fjerne ordet done , der lukker for loop og se om det viser en fejl:

Nedenfor er det modificerede shell-script til batchkonvertering af png-billeder til jpg-format, der indeholder en fejl.

#!/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

Gem filen, og kør den, mens du udfører syntakskontrol i den:

$ bash -n script.sh

Fra ovenstående output kan vi se, at der er et syntaksproblem med vores script, for-loop mangler et afsluttende gjort nøgleord. Og skallen ledte efter den indtil slutningen af filen, og når den ikke fandt den (færdig), udskrev skallen en syntaksfejl:

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

Vi kan lige så godt kombinere den detaljerede tilstand og syntaks-kontroltilstand sammen:

$ bash -vn script.sh

Alternativt kan vi aktivere syntakskontrol ved at ændre den første linje i scriptet ovenfor som i det næste eksempel.

#!/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

Som før skal du gemme filen og køre den, mens du udfører syntakskontrol:

$ ./script.sh

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

Derudover kan vi anvende den indbyggede kommando for shell til at aktivere fejlretningstilstand i scriptet ovenfor.

I eksemplet nedenfor kontrollerer vi kun syntaksen for for loop i vores 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

Gem igen filen og påkald scriptet:

$ ./script.sh 

Sammenfattende skal vi altid sikre, at vi syntaktisk kontrollerer vores shell-scripts for at registrere enhver fejl, før de udføres.

Brug svarformularen nedenfor for at sende os spørgsmål eller feedback vedrørende denne guide. I den tredje del af denne serie skal vi gå videre til at forklare og bruge fejlfindingstilstand med shell-sporing.