Programant en Bash - part 3

Per a la refermar els nostres conceptes aprendrem 2 eines molt útils per a programar i que es desenvolupen perfectament en Bash. Aprendre a crear funcions i definir canonades pot semblar complex a del principi, però després veurem la immensa Utilitat que ens proveeixen.

Canonades (pipes)

Concretament i sense donar moltes voltes, una canonada és un mètode que permet dirigir la sortida d'un procés com l'entrada d'un altre, la qual cosa permet una sèrie d'avantatges, com reduir les línies de codi, prescindir de variables d'emmagatzematge de resultats i millorar l'eficiència de l'script.

Una canonada es reconeix generalment per posseir el símbol | que permet concatenar expressions; si bé és usada per defecte, hi ha altres formes de crear canonades.

Exemple: imprimir missatges recents de l'nucli

#dmesg permet veure els missatges recents de l'nucli i controladors carregats #durante el booteo de sistema; tail imprimeix les últimes parts d'un arxiu o #comando

dmesg | tail

Si bé es poden complicar tant com vulguem, l'estructura bàsica d'una canonada permet que el resultat d'un comando sigui usat com a entrada del següent, el qual pot proveir l'entrada d'un nou comando si seguim afegint canonades consecutives.

Funcions

Les funcions són un conjunt de sentències que s'agrupen per poder ser executades diverses vegades sense tenir q tornar a escriure-les. És equivalent a pensar que quan aprenem a cuinar un tipus de menjar escriurem la seva recepta en un full, i cada vegada que desitgem cuinar aquest menjar vam consultar la recepta en lloc de tornar a escriure un nou full amb la mateixa recepta.

Potser el més important de les funcions és la possibilitat de passar-li paràmetres, dades que aquestes faran servir per processar-los i generar una sortida. La seva estructura és la següent:

function nom-de-la-funció {

processos

}

Exemple: funció que mostra els serveis que funcionen sobre el protocol tcp. També podem veure com aplicar més canonades.

#Definimos un nom de funció, pot ser el que ens agradi.

function serveis_tcp {

#cat concatena i mostra el contingut de la carpeta / etc / services, que és la #que conté tots els serveis amb els seus ports associats.

#el primer grep pren la llista i elimina els comentaris, amb -v invertim el resultat

#el segon grep mostra només els relacionats a tcp

cat / etc / services | grep -v "^ #" | grep tcp

}

Quan necessitem ejectuar aquesta funció només hem de llarmarla pel seu nom:

serveis_tcp

En aquest cas funciona sense paràmetres; en el cas que els tingui hem afegir perquè la funció treballi adequadament, cas contrari la funció no funcionarà adequadament. L'ús de return permet a una funció retornar un valor com a resultat de el procés.

Exemple: funció amb paràmetres d'entrada que calcula la suma de 2 nombres.

#! / Bin / bash
function suma ()
{
#con let podem executar l'operació dins de les cometes
let "resultat = $ 1 + $ 2"

#return permet tornar el valor sencer. Un cop executat el return, el valor quedarà dipositat dins de la variable $?
return $ resultat;
}
 
#se crida a la funció suma i vam passar 2 paràmetres d'entrada.

suma març 2

#se imprimeix el valor de $? amb tiro avaluant el valor real de la variable entre cometes
echo -e "Resultat = $?";

<<Anar a l'anterior part

Gràcies Joan Carles Ortiz!


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   punter Nill va dir

    no estic segur, però la sentència return de les funcions serveix només per tornar un enter entre 0 i 255, com els codis d'error de «exit», generalment 0 si està tot bé i un altre nombre per als altres casos. Encara que en l'exemple aquest funciona, no crec q sigui una bona pràctica retornar el resultat amb return.
    Per ahi estic dient una ximpleria eh! ull! ha!

  2.   Juank va dir

    La veritat em vas deixar amb el dubte. En tot cas, per evitar problemes amb les funcions podem reemplaçar el return per fet en el cas que la funció busqui tornar o imprimir un valor o cadena.

  3.   Abel S.Monte gran va dir

    És cert, per solucionar això es pot fer servir la comanda bc, a la funció suma es pot fer servir: resultat = `echo $ 1 + $ 2 | bc -ql`

  4.   Luis Miguel va dir

    bones,

    M'agradaria saber on puc guardar els arxius bash perquè s'executin en tot el sistema i que no sigui el directori bin, sinó que pugui ser el home per fer còpies de seguretat.

    Gràcies i salutacions.

  5.   Joaquin va dir

    Moltes gracías, estic començant amb el dels scripts, i la veritat que això és molt útil, ets molt amable compartint els teus coneixements!
    Salutacions

    1.    usemoslinux va dir

      Gràcies! Abraçada!
      Pau

  6.   Cristhian va dir

    Syntax error: «(» unexpected
    em surt error a l'intentar córrer l'exemple, el copieu exactament igual

    que pot ser? estic en Ubuntu 14.10