Scripturi shell utile în orice program

Bash este un program de calculator a cărui funcție este de a interpreta comenzi. Se bazează pe shell-ul Unix și a fost scris pentru proiectul GNU , fiind interpretorul de comenzi implicit în majoritatea distribuțiilor GNU/Linux . Numele său este un acronim pentru Bourne-Again Shell , un joc de cuvinte (born-again înseamnă renaștere) care face referire la shell-ul Bourne (sh) , care a fost unul dintre primii interpretori majori Unix.

Astăzi vă vom arăta câteva scripturi shell care pot fi foarte utile dezvoltatorilor. Majoritatea funcționează în orice shell Unix , deși unele necesită rularea specifică a Bash.

Împiedicați utilizatorii fără privilegii să ruleze scriptul

Unele scripturi efectuează sarcini administrative, deci este posibil să ne dorim doar ca utilizatorul root să ruleze scriptul. În acest caz, putem folosi așa ceva:

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

Permiteți executarea scriptului numai unui anumit utilizator

Similar codului de mai sus, ne-am putea dori doar un anumit utilizator să ruleze scriptul. O facem astfel:

#!/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

Verificați dacă se execută un serviciu / proces

Dacă vrem să știm dacă rulează procese dintr-un serviciu sau program, am putea folosi acest script (în acest caz, verifică dacă daemonul Apache rulează) :

#!/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

Creați un fișier de blocare

Uneori trebuie să ne asigurăm că scriptul nu rulează de două sau mai multe ori simultan. Pentru aceasta putem folosi fișierele de blocare. Aceasta este o versiune simplă a unui script care ne permite să facem acest lucru:

#!/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

În acest caz, scriptul verifică dacă fișierul `loquesea.lock` există. Dacă există, scriptul NU își execută sarcinile. Dacă nu există, creează fișierul, execută sarcinile necesare și apoi îl șterge. Totuși, acest lucru nu este în întregime fiabil. Ce s-ar întâmpla dacă scriptul nostru s-ar închide brusc în timp ce rulează?

În acest caz, fișierul de blocare nu va fi șters și, prin urmare, nu ne va permite să rulăm din nou scriptul. Pentru a acoperi aceste cazuri, am putea folosi comanda trap care ne permite să executăm comenzi în cazul în care scriptul nostru se termină în mod neașteptat. Aceasta este o versiune mai avansată, care salvează și PID-ul scriptului care îl execută în fișierul de blocare:

#!/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

Să înțelegem puțin mai bine comanda `trap` . Sintaxa sa este practic aceasta: `trap command signal [signal …];` unde `signal` este semnalul de terminare pe care doriți să îl capturați. Dacă doriți să vedeți o listă de semnale disponibile, puteți rula comanda `kill -l`. În exemplul anterior, semnalele utilizate au fost `INT` (capturează semnalul de terminare produs de Ctrl+c) , `TERM` (terminarea produsă de comanda `kill`) și `EXIT` (terminarea normală a scriptului, fie pentru că nu mai există linii de executat, fie pentru că întâlnește comanda `exit`).

Meniu Opțiuni

Pentru a crea un meniu în care permitem utilizatorului să selecteze o serie de opțiuni, putem folosi următoarea schemă:

#!/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

Solicitați confirmarea înainte de a rula un script

Uneori este util ca utilizatorul să confirme execuția unui lot de instrucțiuni, adică mesajul tipic care cere utilizatorului să introducă da sau nu. Putem face acest lucru astfel:

#!/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"

Sfârșitul articolului. Pur și simplu grozav 

Editare: Trebuie să fiu atent cu spațiile și tabulatorii, pentru că, dintr-un anumit motiv, nu le scriu corect.


Adăugați ca sursă preferată în Google