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.