Kaip atlikti sintaksės derinimo režimo tikrinimą „Shell“ scenarijuose


„Shell Script“ derinimo seriją pradėjome paaiškindami įvairias derinimo parinktis ir kaip įgalinti „shell script“ derinimo režimus.

Parašę savo „shell“ scenarijus, prieš vykdydami scenarijus, rekomenduojame praktiškai patikrinti scenarijų sintaksę, o ne žiūrėti į jų išvestį, kad patvirtintume, jog jie veikia tinkamai.

Šioje serijos dalyje apžvelgsime, kaip naudoti sintaksės tikrinimo derinimo režimą. Nepamirškite, kad pirmoje šios serijos dalyje paaiškinome įvairias derinimo parinktis ir čia jas naudosime scenarijaus derinimui atlikti.

Prieš pereidami į pagrindinį šio vadovo akcentą, trumpai patyrinėkime daugiažodį režimą. Tai įgalina derinimo parinktis -v , kuri liepia apvalkalui rodyti visas scenarijaus eilutes, kol jos skaitomos.

Norėdami parodyti, kaip tai veikia, toliau pateikiamas pavyzdinis apvalkalo scenarijus, skirtas paketais konvertuoti PNG vaizdus į JPG formatą.

Įveskite (arba nukopijuokite ir įklijuokite) į failą.

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

Tada išsaugokite failą ir padarykite scenarijų vykdomąjį naudodami žemiau esančią komandą:

$ chmod +x script.sh

Galime pasinaudoti scenarijumi ir rodyti visas jo eilutes, kai jas skaito apvalkalas taip:

$ bash -v script.sh

Grįžtant prie mūsų akcentuojamos temos, -n įjungiamas sintaksės tikrinimo režimas. Jis nurodo apvalkalui iš esmės perskaityti visas komandas, tačiau jų nevykdo, jis (apvalkalas) nagrinėja tik naudojamą sintaksę.

Jei jūsų apvalkalo scenarijuje yra klaidų, apvalkalas išves klaidas terminale, kitaip jis nieko nerodo.

Sintaksė tikrinimo aktyvavimui yra tokia:

$ bash -n script.sh

Kadangi scenarijaus sintaksė yra teisinga, aukščiau esančioje komandoje nebus rodoma išvestis. Todėl pabandykime pašalinti žodį done , kuris uždaro for ciklą, ir pažiūrėkime, ar jame rodoma klaida:

Žemiau yra modifikuotas apvalkalo scenarijus, skirtas paketais konvertuoti png vaizdus į jpg formatą, kuriame yra klaida.

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

Išsaugokite failą, tada paleiskite jį tikrindami sintaksę:

$ bash -n script.sh

Iš aukščiau pateiktos išvesties galime pamatyti, kad mūsų scenarijuje yra sintaksės problema, for ciklui trūksta baigiamojo raktinio žodžio done . Korpusas ieškojo jo iki failo pabaigos ir, kai jo nerado (padaryta), apvalkalas išspausdino sintaksės klaidą:

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

Mes taip pat galime derinti daugkartinį režimą ir sintaksės tikrinimo režimą:

$ bash -vn script.sh

Arba galime įgalinti sintaksės tikrinimą, modifikuodami pirmąją aukščiau esančio scenarijaus eilutę, kaip kitame pavyzdyje.

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

Kaip ir anksčiau, išsaugokite failą ir paleiskite jį tikrindami sintaksę:

$ ./script.sh

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

Be to, mes galime naudoti įmontuotą apvalkalo komandą, kad įgalintume derinimo režimą aukščiau esančiame scenarijuje.

Toliau pateiktame pavyzdyje mes tikriname tik scenarijaus „for loop“ sintaksę.

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

Dar kartą išsaugokite failą ir iškvieskite scenarijų:

$ ./script.sh 

Apibendrinant, visada turėtume užtikrinti, kad prieš vykdydami sintaksiniu būdu patikrintume savo apvalkalo scenarijus, kad užfiksuotume klaidas.

Norėdami atsiųsti mums klausimų ar atsiliepimų apie šį vadovą, naudokite toliau pateiktą atsakymo formą. Trečioje šios serijos dalyje pereisime prie apvalkalo atsekimo derinimo režimo paaiškinimo ir naudojimo.