de BinHong Lee

Scripturi Shell vs Python sau Perl

Este 2020 acum, cine mai scrie script-uri shell? Am dreptate? Ei bine, se pare că da. ¯ _ (ツ) _ / ¯

Există câteva argumente bune pentru asta aici și aici care se învârt în principal în jurul a 2 lucruri:

  1. Shell există în toate sistemele Unix și folosește funcțiile implicite ale sistemului.
  2. Shell este o „funcție de comandă interactivă” concepută pentru a obține intrări de utilizator în timpul procesului de executare a acestora.

De asemenea, aicieste o lectură suplimentară relevantă despre diferențele dintre sh și bash.

Argumente

În unele ocazii, va trebui să treceți un argument (sau să vă așteptați la unul) în script, cum ar fi modul în care ați putea transfera un param într-o funcție. În acest caz, veți folosi ceva de genul $1 pentru primul argument, $2 pentru al doilea. Iată un exemplu despre cum ar arăta:

În script run_this.sh:

echo "The input message was $1."

Rularea comenzii:

./run_this.sh userInputThe input message was userInput.

Notă: Parametrii sunt separați de spații, deci dacă doriți să introduceți un șir ca parametru care conține un spațiu, ar putea fi necesar să fie ceva de genul ./run_this.sh "user input" doar asa "user input" ar fi socotit ca $1 în întregime.

În cazul în care nu sunteți sigur cât de lungă ar putea fi introducerea utilizatorului și doriți să capturați totul, ați folosi [email protected] in schimb. În exemplul următor, am luat întregul șir și l-am tipărit cuvânt cu cuvânt după ce le-am rupt într-o matrice de șiruri în funcție de spațiile dintre ele.

În script run_this.sh:

userInputs=([email protected])for i in "${userInputs[@]}";; do  echo "$i"done

Rularea comenzii:

./run_this.sh who knows how long this can gowhoknowshowlongthiscango

Funcții

Dacă ați realizat orice fel de programare, ar trebui să vă familiarizați cu conceptul de funcții. Este practic un set de comenzi / operații pe care le veți repeta mereu. În loc să o repetați de mai multe ori în codul dvs., le puteți pune într-o funcție. Apoi, trebuie doar să apelați funcția care reduce efectiv liniile de cod care trebuie scrise.

Notă laterală: dacă nu știți deja, LOC este o măsură oribilă pentru orice fel de măsurare în ceea ce privește programarea. Nu lua asta de la mine, ia asta de la Bill Gates:

„Măsurarea progresului programării pe linii de cod este ca măsurarea progresului construcției aeronavelor în funcție de greutate.

Iată cum arată o funcție normală:

# Declaring the functiondoSomething() {
}
# Calling the functiondoSomething

Destul de simplu și ușor de înțeles. Acum, iată câteva diferențe între funcțiile din scripturile shell și un limbaj de programare normal.

Parametrii

Dacă ar trebui să trimiți un parametru / să folosești un parametru într-o funcție din Java, trebuie să-i declari în declarația de funcție. Arată cam așa.

public static void main(String[] args) {    doSomething("random String");}
private static void doSomething (String words) {    System.out.println(words);}

Cu toate acestea, în shell nu necesită deloc o declarație de tipuri sau nume. Fiecare dintre ele este ca un script separat care trăiește în scriptul în sine. Dacă ar fi să folosiți un param, pur și simplu transmiteți-l și sunați-l cum ar face-o dacă ați fi introdus pentru acest script la nivelul superior. Ceva de genul:

doSomething() {    echo $1}
doSomething "random String"
  1. Similar cu cel de mai sus, dacă doriți să luați totul, îl veți folosi [email protected] in loc de $1 de cand $1 ar folosi doar prima intrare (și $2 pentru al doilea etc.).
  2. Funcțiile trebuie declarate înainte de a fi apelate. (De obicei, începutul fișierului înainte de orice operație principală.)

Întoarcere

Să presupunem că creăm un script ca mai jos numit run_this.sh:

doSomething() {    echo "magic"    return 0}
output=`doSomething`echo $output

Acum să-l rulăm și să vedem ce este atribuit fișierului output variabil.

$ ./run_this.shmagic

Rețineți că în loc de 0, se arată magic in schimb. Asta pentru că atunci când o faci output=`doSomething`, atribuie mesajul de ieșire output în loc de valoarea returnată, deoarece mesajul de ieșire este modul în care comunicați aproape orice în scriptul shell.

Deci, când are sens să folosiți return apel? Când îl utilizați ca parte a unei instrucțiuni if. Ceva de genul:

În script run_this.sh:

doSomething() {    echo "magic"    return 0}
if doSomething; then    echo "Its true!"fi

Executarea comenzii:

./run_this.shIts true!

În acest caz, return 0 mijloace true in timp ce return 1 însemnat false într-un tradițional boolean sens.

Ecou multi-linie

Există momente când trebuie să imprimați un mesaj pe mai multe linii. Există câteva modalități de a ocoli acest lucru. Cel mai simplu mod este de a folosi echo de mai multe ori astfel:

echo "line1"echo "line2"echo "line3"

Funcționează, dar probabil nu este cel mai elegant mod de a evita acest lucru. În schimb, puteți utiliza cat <&lt; EOF în schimb. Ceva de genul:

cat << EOFline1line2line3EOF

Rețineți că nu ar trebui să existe nimic (inclusiv spații sau file) înainte EOF. Dacă doriți să o faceți într-un ifdeclarație, ar trebui să arate cam așa.

if [ "a" == "a" ]; then  cat << EOFline1line2line3EOFfi

Vă dați seama că chiar și mesajele în sine sunt aliniate la stânga. Acest lucru se datorează faptului că, dacă le lăsați cu file, mesajul de ieșire afișat în linia de comandă va fi, de asemenea, cu file. De asemenea, dacă EOF este cu file, shell-ul se va plânge de acest lucru și de obicei termină scriptul acolo.

Steaguri / Opțiuni

Probabil că ați văzut câteva dintre scripturile sau comenzile care vin cu posibilitatea de a adăuga steaguri (și, uneori, argumente pentru steagul specific). Ceva asemănător cu git commit -a -m "Some commit message".

Iată un exemplu rapid de cum arată (am încercat să fiu cât mai cuprinzător cu exemplul.)

În script run_this.sh:

while getopts ac: opt; do    case $opt in        a)            echo ""a" was executed."            ;;        c)            echo ""c" was executed with parameter "$OPTARG"."            ;;        ?)            echo "Invalid option: -$opt"            exit 1            ;;        :)            echo "option -$opt requires an argument."            exit 1            ;;    esacdone

Executarea comenzii:

./run_this.sh
./run_this.sh -a"a" was executed.
./run_this.sh -coption -c requires an argument.
./run_this.sh -c abcd"c" was executed with parameter "abcd".
./run_this.sh -a -c abc"a" was executed."c" was executed with parameter "abc".
./run_this.sh -xInvalid option: -x

În exemplul de mai sus, diferențele dintre opțiune -a și -c este că în getopts linia, c are un colon (:) urmărind-o după ce, prin urmare, i-a spus programului să se aștepte la un parametru pentru opțiune. Un alt lucru de reținut este că opțiunile trebuie declarate alfabetic. Dacă declarați ceva de genul acb, bdeclarația ar fi ignorată și folosind -b pavilion ar duce la mesajul de eroare în loc de b caz în starea comutatorului.

Mulțumesc pentru lectură!

Despre mine

În prezent lucrez la Facebook ca inginer software. Îmi petrec o parte din timpul meu liber experimentând și construind lucruri noi cu tehnologii care mi se par distractive și interesante. Urmăriți călătoria mea de explorare aici sau pe GitHub.

Referințe