Slik utfører du feilsøkingsmodus for syntakskontroll i Shell-skript


Vi startet shell script debugging-serien ved å forklare de forskjellige feilsøkingsalternativene og hvordan du aktiverer shell script debugging moduser.

Etter å ha skrevet shell-skriptene dine, anbefales det at vi praktisk talt sjekker syntaksen i skriptene før du kjører dem, i motsetning til å se på utdataene deres for å bekrefte at de fungerer som de skal.

I denne delen av serien skal vi gå gjennom hvordan du bruker syntakssjekking av feilsøkingsmodus. Husk at vi forklarte de forskjellige feilsøkingsalternativene i den første delen av denne serien, og her vil vi bruke dem til å utføre skriptfeilsøking.

Før vi går til hovedfokuset i denne veiledningen, la oss kort utforske den detaljerte modusen. Det er aktivert av -v feilsøkingsalternativet, som forteller skallet å vise alle linjer i et skript mens de leses.

For å demonstrere hvordan dette fungerer, nedenfor er et eksempel på et skallskript for batchkonvertering av PNG-bilder til JPG-format.

Skriv (eller kopier og lim inn) den 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

Lagre deretter filen og gjør skriptet kjørbart ved å bruke kommandoen nedenfor:

$ chmod +x script.sh

Vi kan påkalle skriptet og vise alle linjene i det når de leses av skallet slik:

$ bash -v script.sh

For å komme tilbake til temaet vårt, aktiverer -n syntakskontrollmodus. Det instruerer skallet til å lese alle kommandoene, men utfører dem ikke, det (skallet) undersøker bare syntaksen som brukes.

I tilfelle det er feil i skallskriptet ditt, vil skallet sende ut feilene på terminalen, ellers viser det ingenting.

Syntaksen for å aktivere syntakskontroll er som følger:

$ bash -n script.sh

Fordi syntaksen i skriptet er riktig, vil ikke kommandoen ovenfor vise noe utdata. La oss derfor prøve å fjerne done-ordet som lukker for-løkken og se om det viser en feil:

Nedenfor er det modifiserte shell-skriptet for batchkonvertering av png-bilder til jpg-format som inneholder en feil.

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

Lagre filen, og kjør den mens du utfører syntakskontroll i den:

$ bash -n script.sh

Fra utdataene ovenfor kan vi se at det er et syntaksproblem med skriptet vårt, for-løkken mangler et avsluttende done søkeordord. Og skallet så etter det til slutten av filen, og når det ikke fant det (ferdig), skrev skallet ut en syntaksfeil:

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

Vi kan like godt kombinere den verbose modusen og syntakskontrollmodusen sammen:

$ bash -vn script.sh

Alternativt kan vi aktivere syntakskontroll ved å endre den første linjen i skriptet ovenfor som i neste 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, lagre filen og kjør den mens du utfører syntakskontroll:

$ ./script.sh

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

I tillegg kan vi bruke den innebygde set shell-kommandoen for å aktivere feilsøkingsmodus i skriptet ovenfor.

I eksemplet nedenfor sjekker vi kun syntaksen til for-løkken i skriptet vårt.

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

Igjen, lagre filen og påkall skriptet:

$ ./script.sh 

Oppsummert bør vi alltid sørge for at vi syntaktisk sjekker shell-skriptene våre for å fange opp eventuelle feil før vi kjører dem.

For å sende oss spørsmål eller tilbakemeldinger angående denne veiledningen, bruk svarskjemaet nedenfor. I den tredje delen av denne serien skal vi gå over til å forklare og bruke feilsøkingsmodus for skallsporing.