Termenul "scripting shell" este menționat de multe ori în forumurile Linux, dar mulți utilizatori nu sunt familiarizați cu acesta. Învățarea acestei metode de programare ușoară și puternică vă poate ajuta să economisiți timp, să învățați mai bine linia de comandă și să eliminați sarcini plictisitoare de gestionare a fișierelor.
Fiind un utilizator Linux înseamnă să jucați cu linia de comandă. Îmi place sau nu, sunt doar câteva lucruri care se fac mult mai ușor prin această interfață decât prin îndreptare și clic. Cu cat utilizati mai mult si aflati linia de comanda, cu atat veti vedea potentialul. Linia de comandă însăși este un program: shell-ul. Majoritatea distribuțiilor Linux folosesc astăzi Bash, și la asta intri cu adevărat comenzile.
Acum, unii dintre voi care ați folosit Windows înainte de a utiliza Linux pot aminti fișiere batch. Acestea erau fișiere text foarte mici pe care le puteai umple cu comenzi pentru a le executa și Windows le rula la rândul lor. A fost o modalitate inteligentă și elegantă de a face niște lucruri, cum ar fi alergarea în laboratorul de liceu atunci când nu puteați deschide dosare de sistem sau creați comenzi rapide. Fișierele batch din Windows, deși utile, sunt o imitație ieftină a scripturilor shell.
Shell script-urile ne permit să programați comenzi în lanțuri și să le execute sistemul ca un eveniment scripted, la fel ca fișierele batch. De asemenea, ele permit funcții mult mai utile, cum ar fi înlocuirea comenzilor. Puteți să invocați o comandă, ca și data, și să folosiți ieșirea ca parte a unei scheme de denumire a fișierelor. Puteți automatiza backup-urile și fiecare fișier copiat poate avea data curentă atașată la sfârșitul numelui. Scripturile nu sunt doar invocări ale comenzilor. Sunt programe în sine. Scriptarea vă permite să utilizați funcții de programare - cum ar fi buclele "for", if / then / else și așa mai departe - direct în interfața sistemului de operare. Și nu trebuie să învățați altă limbă pentru că folosiți ceea ce deja știți: linia de comandă.
Aceasta este cu adevărat puterea de scripting, cred. Puteți să programați comenzi pe care le cunoașteți deja, în timp ce învățați capsele din majoritatea limbilor de programare majore. Trebuie să faci ceva repetitiv și plictisitor? Script-l! Aveți nevoie de o comandă rapidă pentru o comandă într-adevăr convoluționată? Script-l! Doriți să construiți o interfață de linie de comandă cu adevărat ușor de folosit pentru ceva? Script-l!
Înainte de a începe seriile noastre de scripting, să acoperim câteva informații de bază. Vom folosi shell-ul bash, pe care majoritatea distribuțiilor Linux le utilizează nativ. Bash este disponibil pentru utilizatorii de Mac OS și Cygwin și pentru Windows. Deoarece este atât de universal, ar trebui să puteți să scriu script-uri, indiferent de platforma dvs. În plus, atâta timp cât toate comenzile care fac referință există, scripturile pot funcționa pe mai multe platforme cu puțin sau deloc.
Scripting-ul poate folosi cu ușurință privilegiile "administrator" sau "superuser", deci este mai bine să testați scripturi înainte de a le pune la lucru. Utilizați, de asemenea, bunul simț, cum ar fi să vă asigurați că aveți copii de siguranță ale fișierelor pe care urmează să rulați un script. De asemenea, este foarte important să utilizați opțiunile potrivite, cum ar fi -i pentru comanda rm, astfel încât interacțiunea dvs. să fie necesară. Acest lucru poate împiedica unele greșeli urâte. Ca atare, citiți scripturile pe care le descărcați și fiți atenți cu datele pe care le aveți, doar în cazul în care lucrurile nu merg bine.
La baza lor, scripturile sunt doar fișiere text. Puteți folosi orice editor de text pentru a le scrie: gedit, emacs, vim, nano ... Această listă continuă. Doar asigurați-vă că ați salvat-o ca text simplu, nu ca un text bogat sau un document Word. Deoarece iubesc ușurința de utilizare pe care nano o oferă, o să folosesc asta.
Scripturile sunt executate ca programe, iar pentru ca acest lucru să se întâmple, ei trebuie să aibă permisiunile corespunzătoare. Puteți face scripturi executabile executând următoarea comandă pe ea:
chmod + x ~ / somecrazyfolder / script1
Acest lucru va permite oricui să ruleze acel script special. Dacă doriți să restricționați utilizarea acestuia doar la utilizatorul dvs., puteți folosi în schimb:
chmod u + x ~ / somecrazyfolder / script1
Pentru a rula acest script, va trebui să cd în directorul corespunzător și apoi să rulați scriptul astfel:
cd ~ / somecrazyfolder
./script1
Pentru a face lucrurile mai convenabile, puteți plasa scripturi într-un director "bin" în directorul dvs. de acasă:
~ / Bin
În multe distribuții moderne, acest dosar nu mai este creat în mod implicit, dar îl puteți crea. Acest lucru este de obicei în cazul în care fișierele executabile sunt stocate care aparțin utilizatorului și nu altor utilizatori. Prin plasarea de scripturi aici, puteți să le rulați doar prin tastarea numelui lor, la fel ca și alte comenzi, în loc să trebuiască să codați în jur și să folosiți prefixul "./".
Înainte de a numi un script, totuși, trebuie să aveți următoarea comandă pentru a verifica dacă aveți instalat un program care folosește acest nume:
care [comandă]
O mulțime de oameni numesc scripturile lor timpurii "test", iar când încearcă să o execute pe linia de comandă, nu se întâmplă nimic. Acest lucru se datorează faptului că este în conflict cu comanda de test, care nu face nimic fără argumente. Asigurați-vă întotdeauna că numele dvs. de scenariu nu intră în conflict cu comenzile, altfel s-ar putea să găsiți că faceți lucruri pe care nu intenționați să le faceți!
După cum am menționat mai înainte, fiecare fișier script este în esență un text simplu. Asta nu înseamnă că poți să scrii ceea ce dorești cu toții. Când un fișier text este încercat să fie executat, shell-urile vor analiza prin ele indicii dacă sunt scripturi sau nu și cum să se ocupe de totul în mod corespunzător. Din acest motiv, există câteva orientări pe care trebuie să le cunoașteți.
Hash-Bang Hack
Când o cochilie parsează printr-un fișier text, cea mai directă modalitate de a identifica fișierul ca script este făcând prima linie:
#! / Bin / bash
Dacă utilizați o altă coajă, înlocuiți-o aici. Liniile de comentariu încep cu hashes (#), dar adăugând bang (!) Și calea shell după ce este un fel de hack care va ocoli această regulă de comentariu și va forța scriptul să se execute cu shell-ul la care se îndreaptă această linie.
Noua linie = Noua comandă
Fiecare linie nouă ar trebui să fie considerată o comandă nouă sau o componentă a unui sistem mai mare. Dacă instrucțiunile / / else / else, de exemplu, vor prelua mai multe linii, fiecare componentă a acelui sistem se află într-o linie nouă. Nu lăsați ca o comandă să sară în linia următoare, deoarece aceasta poate trunchia comanda anterioară și vă poate da o eroare pe linia următoare. Dacă editorul dvs. de text face acest lucru, ar trebui să dezactivați împachetarea textului pentru a fi în siguranță. Puteți dezactiva înfășurarea textului în nano-biți apăsând ALT + L.
Comentariu Deseori cu #s
Dacă începeți o linie cu un #, linia este ignorată. Aceasta o transformă într-o linie de comentarii, în care vă puteți aminti de ceea ce a fost rezultatul comenzii anterioare sau de ceea ce va face următoarea comandă. Din nou, dezactivați împachetarea textului sau rupeți comentariul în mai multe linii care încep cu un hash. Utilizarea unui număr mare de comentarii este o practică bună de păstrat, deoarece vă permite altor persoane să vă ajusteze scripturile mai ușor. Singura excepție este hack-hash-ul menționat anterior, deci nu urmați #s cu! S. ;-)
Comenzile sunt înconjurate de paranteze
În zilele mai în vârstă, substituțiile de comandă au fost efectuate cu semne distincte ("împărtășesc"). Nu vom mai atinge încă acest lucru, dar, pe măsură ce majoritatea oamenilor se duc și explorează după ce au învățat elementele de bază, este probabil o idee bună să menționezi că ar trebui să folosești paranteze. Acest lucru se datorează în principal faptului că atunci când cuibăreți - puneți comenzi în interiorul altor comenzi - parantezele funcționează mai bine.
Să începem cu un script simplu care vă permite să copiați fișierele și să adăugați date la sfârșitul numelui fișierului. Să o numim "datecp". În primul rând, hai să verificăm dacă acel nume este în conflict cu ceva:
Puteți vedea că nu există nici o ieșire a comenzii, deci toți suntem pregătiți să folosim acest nume.
Să creăm un fișier gol în folderul ~ / bin:
atingeți ~ / bin / datecp
Și să schimbăm permisiunea acum, înainte să uităm:
Să începem apoi să ne construim scenariul. Deschideți acel fișier în editorul de text ales. După cum am spus, îmi place simplitatea nano-ului.
nano ~ / bin / datecp
Și, hai să mergem mai departe și să punem în prima linie precondiționată, și un comentariu despre ceea ce face acest script.
Apoi, să declarăm o variabilă. Dacă ați luat vreodată algebră, probabil că știți ce înseamnă asta. O variabilă ne permite să stocăm informații și să facem lucruri cu ele. Variabilele se pot "extinde" atunci când sunt menționate în altă parte. Adică, în loc să își afișeze numele, vor afișa conținutul stocat. Mai târziu, puteți spune aceeași variabilă pentru a stoca diferite informații și orice instrucțiune care apare după aceea va folosi noile informații. Este un loc de substituție foarte interesant.
Ce vom introduce în variabilă? Ei bine, să stocăm data și ora! Pentru a face acest lucru, vom apela comanda de date.
Uitați-vă la captura de ecran de mai jos pentru a construi ieșirea comenzii date:
Puteți vedea că adăugând variabile diferite care încep cu%, puteți schimba rezultatul comenzii la ceea ce doriți. Pentru mai multe informații, puteți să consultați pagina manuală a comenzii pentru data.
Să folosim ultima iterație a comenzii de dată, "data +% m_% d_% y-% H.% M.% S" și să o folosim în scriptul nostru.
Dacă am salva acest scenariu chiar acum, am putea să-l rulam și ne-ar fi dat rezultatul comenzii de date așa cum ne-am fi așteptat:
Dar, să facem ceva diferit. Să dăm un nume de variabilă, ca data_formatted la această comandă. Sintaxa corectă pentru aceasta este după cum urmează:
variabila = $ (argumente de comandă-opțiuni)
Și pentru noi, vom construi așa:
date_formatted = $ (data +% m_% d_% y-% H.% M.% S)
Aceasta este ceea ce numim înlocuire de comandă. În mod esențial, spunem că fiecare dată când se afișează variabila "date_formatted", se rulează comanda în interiorul parantezelor. Apoi, orice ieșire pe care o dau comenzile ar trebui afișată în locul numelui variabilei, "date_formatted".
Iată un exemplu de script și rezultatele sale:
Rețineți că există două spații în ieșire. Spațiul din cadrul cotelor comenzii ecou și spațiul din fața variabilei sunt afișate ambele. Nu utilizați spații dacă nu doriți ca acestea să apară. De asemenea, rețineți că, fără această linie de "ecou" adăugată, scenariul nu va da absolut nici un rezultat.
Să ne întoarcem la scenariul nostru. Să adăugăm în continuare partea de copiere a comenzii.
cp -iv $ 1 $ 2. $ date_formatted
Aceasta va invoca comanda de copiere, cu opțiunile -i și -v. Primul vă va cere verificarea înainte de a suprascrie un fișier, iar acesta din urmă va afișa ceea ce se află în jos pe linia de comandă.
Apoi, puteți vedea că am adăugat opțiunea "$ 1". La scrierea scriptului, semnul dolar ($) urmat de un număr va denota acel argument numerotat al scriptului când acesta a fost invocat. De exemplu, în următoarea comandă:
cp -iv Trogdor2.mp3 ringtone.mp3
Primul argument este "Trogdor2.mp3", iar al doilea argument este "ringtone.mp3".
Privind înapoi la scenariul nostru, putem vedea că menționăm două argumente:
Aceasta înseamnă că atunci când rulați scriptul, va trebui să furnizăm două argumente pentru ca scriptul să funcționeze corect. Primul argument, $ 1, este fișierul care va fi copiat și este înlocuit ca primul argument al comenzii "cp -iv".
Al doilea argument, $ 2, va acționa ca fișier de ieșire pentru aceeași comandă. Dar, puteți vedea, de asemenea, că este diferit. Am adăugat o perioadă și am făcut referire la variabila "date_formatted" de mai sus. Curios despre ceea ce face asta?
Iată ce se întâmplă atunci când scriptul este rulat:
Puteți vedea că fișierul de ieșire este listat ca orice am introdus pentru $ 2, urmat de o perioadă, apoi ieșirea comenzii de dată! Are sens, nu?
Acum, când rulez comanda datecp, acesta va rula acest script și îmi permite să copiez orice fișier într-o locație nouă și să adaug automat data și ora la sfârșitul fișierului. Utile pentru arhivarea chestiilor!
Shell scripting-ul este inima de a face sistemul dvs. de operare pentru tine. Nu trebuie să înveți un nou limbaj de programare pentru a face acest lucru. Încercați să scriptați câteva comenzi de bază la domiciliu și să începeți să vă gândiți la ce puteți folosi pentru asta.
Scrii? Aveți vreun sfat pentru începători? Împărtășiți-vă gândurile în comentariile! Mai multe vor veni în această serie!