Scripts shell útils en qualsevol programa

Bash és un programa informàtic la funció del qual consisteix a interpretar ordres. Està basat en la shell d' Unix i va ser escrit per al projecte GNU sent l'intèrpret d'ordres per defecte a la majoria de les distribucions de GNU/Linux . El seu nom és un acrònim de Bourne-Again Shell (un altre shell bourne) , fent un joc de paraules (born-again significa renaixement) sobre el Bourne shell (sh) , que va ser un dels primers intèrprets importants d'Unix.

Avui mostrarem alguns scripts d'intèrpret d'ordres que poden ser de gran utilitat per als desenvolupadors. La majoria funcionen en qualsevol shell d' Unix , encara que alguns requereixen que siguin executats específicament per Bash.

Evitar que usuaris sense privilegis executin l'script

Alguns scripts realitzen tasques administratives per la qual cosa podríem voler que només l'usuari root executi l'script. En aquest cas podem fer servir alguna cosa com això:

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

Permetre l'execució de l'script només a un usuari específic

De manera similar a el codi anterior, podríem voler que només un usuari específic executi l'script. Ho fem així:

#!/bin/bash
AUTHORIZED_USER="usuario_permitido"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi

Verificar que un servei / procés s'està executant

Si volem saber si hi ha processos d'algun servei o programa executant-se podríem fer servir aquest script (en aquest cas verifica que el dimoni d' Apache estigui corrent) :

#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutandose"
else
echo "Chanfle! El servicio $SERVICE esta detenido"
fi

Crear un arxiu de bloqueig

A vegades hem d'assegurar que l'script no s'executi dues o més vegades simultànies. Per a això podem fer ús dels arxius de bloqueig. Aquesta és una versió senzilla d'un script que ens permet fer això:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "hago muchas cosas importantes aqui"
rm $lockfile
else
echo "ya hay otro proceso corriendo"
fi

En aquest cas, es verifica que el fitxer loquesea.lock existeixi. En cas que existeixi, l'script NO executa les vostres tasques. Si no existeix, creeu el fitxer, executeu les tasques que heu d'executar i l'elimineu. Però això no és del tot fiable. Què passaria si mentre el nostre script s'està executant és tancat abruptament?

En aquest cas l'arxiu de bloqueig no s'esborraria, i per tant, no ens permetria executar l'script de nou. Per cobrir aquests casos, podríem fer ús de la comanda trap que ens permet executar ordres en cas que el nostre script acabi de manera inesperada. Aquesta és una versió més avançada que a més guarda dins de l'arxiu de bloqueig el PID de l'script que l'executa:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "hago muchas cosas aqui tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutandose"
echo "corriendo con el PID: $(cat $lockfile)"
fi

Entenguem una mica millor l'ordre trap . La sintaxi del mateix és bàsicament aquesta: trap comanda signal [signal …]; on signal és el senyal de terminació que vols atrapar. Si voleu veure una llista dels signals disponibles podeu executar l'ordre kill -l. Per al cas anterior es van fer servir els signals INT (captura la terminació produïda per un Ctrl+c) , TERM (terminació produïda per l'ordre kill) i EXIT (terminació normal d'un script, ja sigui perquè ja no hi ha més línies que executar o perquè es troba amb l'ordre exit).

Menú d'opcions

Per fer un menú a on permetem a l'usuari seleccionar una sèrie d'opcions podem fer servir el següent esquema:

#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. quien soy?"
echo "2. cuanto espacio tengo"
echo "3. que es esto?"
echo "4. Salir"
echo -n "Seleccione una opcion [1 - 4]"
read opcion
case $opcion in
1) echo "este eres:";
whoami;;
2) echo "tienes esto";
df;;
3) uname -r;;
4) echo "chao";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan dificil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done

Demana confirmació abans d'executar un script

De vegades és útil fer que l'usuari confirmi l'execució d'un lot de sentències, és a dir, el típic missatge que demana a l'usuari escriure yes o no. Això ho podem fer així:

#!/bin/bash
while true; do
echo
read -p "esta seguro de hacer lo que sea que vaya a hacer " yn
case $yn in
yes ) break;;
no ) exit;;
* ) echo "por favor responda yes o no";;
esac
done
echo "si se ejecuta esto es que aceptaste"

Fi de larticle. Senzillament genial 

Edit: Cal anar amb compte amb els espais i tabulacions, que per algun motiu, no m'estan sortint ¬¬


Afegir com a font preferida a Google