fatmawati achmad zaenuri / Shutterstock
Linux Bashi skriptide vead ja kirjavead võivad skripti käivitamisel teha kohutavaid asju. Siin on mõned viisid, kuidas kontrollida skriptide süntaksit enne nende käivitamist.
need tüütud vead
Koodi kirjutamine on raske. Või täpsemalt öeldes on raske kirjutada mittetriviaalset koodi ilma vigadeta. Ja mida rohkem koodiridu on programmis või skriptis, seda tõenäolisem on, et selles on vigu.
Keel, milles te programmeerite, on sellega otseselt seotud. Assamblee programmeerimine on palju keerulisem kui C programmeerimine ja C programmeerimine on keerulisem kui Pythoni programmeerimine. Mida madalamas keeles programmeerite, seda rohkem tööd peate ise tegema. Python võib nautida sisseehitatud prügikoristusrutiine, kuid C ja assembler kindlasti mitte.
Linuxi kestaskriptide kirjutamine seab omad väljakutsed. Kompileeritud keele (nt C) puhul loeb programm nimega kompilaator oma lähtekoodi (inimloetavad juhised, mille tekstifaili kirjutate) ja teisendab selle binaarseks täitmisfailiks. Binaarfail sisaldab masinkoodi juhiseid, mida arvuti mõistab ja mille alusel tegutseda.
Kompilaator loob binaarfaili ainult siis, kui lähtekood, mida ta loeb ja sõelub, järgib keele süntaksit ja muid reegleid. Kui kirjutate a reserveeritud sõna — Üks keele käsusõnadest — või vale muutuja nimi, annab kompilaator veateate.
Näiteks mõned keeled nõuavad muutuja deklareerimist enne selle kasutamist, teised pole nii valivad. Kui keel, milles töötate, nõuab muutujate deklareerimist, kuid unustate seda teha, saadab kompilaator teistsuguse veateate. Nii tüütud kui need kompileerimisaja vead ka pole, tabavad nad palju probleeme ja sunnivad teid neid parandama. Kuid isegi siis, kui teil on programm, millel seda pole süntaksivead ei tähenda, et selles vigu poleks. kaugel sealt
Vead, mis on tingitud loogikavead Neid on tavaliselt palju raskem tuvastada. Kui käsite oma programmil lisada kaks ja kolm, kuid soovite tõesti lisada kaks ja kaks, ei saa te oodatud vastust. Kuid programm teeb seda, milleks ta on kirjutatud. Programmi koostisel ega süntaksil pole midagi viga. Probleem on sinus. Olete kirjutanud hästi vormindatud programmi, mis ei tee seda, mida tahtsite.
test on raske
Programmi, isegi lihtsa, põhjalik testimine võtab palju aega. Selle mitmekordsest käivitamisest ei piisa; peate tõesti testima kõiki oma koodi täitmisteid, et kõik koodi osad oleksid kontrollitud. Kui programm nõuab sisendit, peab see andma piisava sisendväärtuste vahemiku, et testida kõiki tingimusi, sealhulgas vastuvõetamatut sisendit.
Kõrgema taseme keelte puhul aitavad ühikutestid ja automaattestid muuta ulatusliku testimise juhitavaks harjutuseks. Seega tekib küsimus, kas on olemas mõni tööriist, mis aitaks meil veatuid Bashi kestaskripte kirjutada?
Vastus on jah, sealhulgas Bashi kest ise.
Bashi kasutamine skripti süntaksi kontrollimiseks
pidu |_+_| (noexec) käsib Bashil skripti lugeda ja süntaksivigu kontrollida ilma skripti käivitamata. Sõltuvalt sellest, mida teie skript kavatseb teha, võib see olla palju turvalisem kui selle käitamine ja probleemide otsimine.
Siin on skript, mida me kontrollime. See pole keeruline, enamasti on see komplekt |_+_| avaldused. Taotlege ja aktsepteerige numbrit, mis tähistab kuud. Stsenaarium otsustab, millisesse aastaaega kuu kuulub. Ilmselgelt see ei tööta, kui kasutaja ei sisesta ühtegi sisendit või sisestab vale sisendi, näiteks numbri asemel tähe.
|_+_|See jaotis kontrollib, kas kasutaja on midagi sisestanud. Testib, kas |_+_| muutuja pole määratud.
|_+_|See jaotis kontrollib, kas nad on sisestanud numbri vahemikus 1 kuni 12. Samuti püüab see kinni vale sisendi, mis ei ole number, kuna tähti ja kirjavahemärke ei tõlgita numbrilisteks väärtusteks.
|_+_|Kõik muud If-klauslid kontrollivad, kas |_+_| on väärtus muutuja on kahe väärtuse vahel. Kui jah, siis kuu kuulub sellesse aastaaega. Näiteks kui kasutaja sisestatud kuu on 6, 7 või 8, on tegemist suvekuuga.
|_+_|Kui soovite meie näidetega töötada, kopeerige ja kleepige skripti tekst redaktorisse ning salvestage see kui 'seasons.sh'. Seejärel muutke skript käivitatavaks, kasutades |_+_| Ma saadan:
|_+_|
Saame skripti testida
- Ärge andke üldse sisendit.
- Sisestage mittenumbriline sisend.
- Sisestage arvväärtus, mis jääb vahemikku 1–12 välja.
- Arvväärtuste pakkumine vahemikus 1 kuni 12.
Kõigil juhtudel käivitame skripti sama käsuga. Ainus erinevus on sisend, mida kasutaja skripti reklaamimisel annab.
|_+_|
Tundub, et see töötab ootuspäraselt. Laske Bashil kontrollida meie skripti süntaksit. Teeme seda, kutsudes esile |_+_| (noexec) ja meie skripti nime edastamine.
|_+_|
See on juhtum, kus 'uudiste puudumine on hea uudis'. Vaikselt käsureale naasmine on Bashi viis öelda, et kõik tundub olevat korras. Saboteerime oma skripti ja sisestame vea.
eemaldame |_+_| algusest |_+_| klausel.
|_+_|Nüüd käivitame skripti kõigepealt ilma ja seejärel kasutaja sisendiga.
|_+_|
Skripti esmakordsel käitamisel kasutaja väärtust ei sisesta ja seetõttu skript lõpeb. Jaotisesse, mille oleme saboteerinud, ei jõuta kunagi. Skript väljub ilma Bashi tõrketeateta.
Skripti teistkordsel käitamisel annab kasutaja sisendväärtuse ja esimene if-klausel käivitatakse, et kontrollida kasutaja sisendi mõistust. See käivitab Bashi tõrketeate.
Pange tähele, et Bash kontrollib selle klausli süntaksit ja kõiki teisi koodiridu, kuna see ei hooli loogika skriptist Kui Bash skripti kontrollib, kasutajal ei paluta numbrit sisestada, kuna skript ei tööta.
Skripti erinevad võimalikud täitmisteed ei mõjuta seda, kuidas Bash süntaksit kontrollib. Bash töötab lihtsalt ja metoodiliselt skripti ülaosast alla, kontrollides iga rea süntaksit.
Utiliit ShellCheck
Linter, mis sai nime Unixi hiilgeaegadest pärit C-lähtekoodi kontrollimise tööriista järgi, on koodianalüüsi tööriist, mida kasutatakse programmeerimisvigade, stiilivigade ja kahtlase või küsitava keelekasutuse tuvastamiseks. Linterid on saadaval paljude programmeerimiskeelte jaoks ja on kuulsad oma pedantsuse poolest. Mitte kõik, mille linter leiab, pole viga ise aga kõik, mis sind tähele paneb, on ilmselt tähelepanu väärt.
ShellCheck on shelliskriptide koodianalüüsi tööriist. See käitub Bashi jaoks linterina.
Paneme, mis puudu on |_+_| reserveeritud sõna uuesti meie skriptis ja proovige midagi muud. Eemaldame avasulu '['delprimerísimo[fromtheveryfirst|_+_| klausel.
|_+_|kui kasutame skripti kontrollimiseks Bashi, ei leia see probleeme.
|_+_| |_+_|
Aga kui me proovime jooksma skripti puhul näeme veateadet. Ja hoolimata veateatest jätkab skripti töötamist. Seetõttu on mõned vead nii ohtlikud. Kui skriptis hiljem tehtavad toimingud põhinevad kehtival kasutaja sisendil, on skripti käitumine ettearvamatu. See võib andmed ohtu seada.
Põhjus, miks Bash |_+_| (noexec) suvand ei leia skriptis olevat viga avanev sulg [isanexternalprogramname[isanexternalprogramched|_+_|. See ei ole osa Bashist. See on stenogrammi |_+_| kasutamine Ma saadan.
Bash ei kontrolli skripti kinnitamisel väliste programmide kasutamist.
ShellChecki installimine
ShellCheck nõuab installimist. Selle Ubuntu installimiseks tippige:
|_+_|
ShellChecki installimiseks Fedorasse kasutage seda käsku. Pange tähele, et paketi nimi on tõstutundlik, kuid kui käivitate käsu terminaliaknas, on kõik tõstutundlikud.
|_+_|
Manjaros ja sarnastes Arch-põhistes distributsioonides kasutame |_+_|:
|_+_|
ShellChecki kasutamine
Proovime oma skriptis ShellChecki käivitada.
|_+_|
ShellCheck leiab probleemi ja annab sellest meile teada ning pakub lisateabe saamiseks linke. Kui teete lingil paremklõpsu ja valite ilmuvast kontekstimenüüst 'Ava link', avaneb link teie brauseris.
ShellCheck leiab ka teise probleemi, mis pole nii tõsine. See on esitatud rohelises tekstis. See näitab, et tegemist on hoiatusega, mitte otsese veaga.
Parandame oma vea ja asendame '['Onebug-fixystrategytocorrectthehighest priorityissuesessuesja töötame madalama prioriteediga probleemideni
Asendame puuduva '['ja käivitameShellCheckoncemore[andranShellCheckoncemore
|_+_|
Ainus ShellChecki väljund viitab meie varasemale hoiatusele, nii et see on hea. Meil ei ole ühtegi esmatähtsat probleemi, mis vajaks lahendamist.
Hoiatus ütleb meile, et kasutades |_+_| käsk ilma |_+_| (loe nii nagu on) käsitleb kõiki sisendis olevaid kaldkriipse paomärkidena. See on hea näide sellest, millist pedantset väljundit linter võib tekitada. Meie puhul ei tohiks kasutaja niikuinii kaldkriipsu sisestada, meil on vaja numbrit.
Sellised hoiatused nõuavad programmeerija hinnangut. Kas pingutada selle parandamiseks või jätta see nii, nagu see on? See on lihtne kahe sekundi parandus. Ja see hoiab ära hoiatuse ShellChecki väljundi segamise, nii et saame järgida ka teie nõuandeid. Lisame |_+_| lippude valikule 'r'. käsk ja salvestage skript.
|_+_|ShellChecki veel kord käivitamine annab meile puhta tervise.
ShellCheck on sinu sõber
ShellCheck suudab tuvastada, aru anda ja nõustada mitmesuguseid probleeme. Vaadake nende halva koodi galeriid, mis näitab, mitut tüüpi probleeme saate märgata.
See on tasuta, kiire ja võtab kestaskriptide kirjutamisest palju vaeva. Mis ei meeldi?
Mida sa arvad?