Handige shellscripts in elk programma

Bash is een computerprogramma dat commando's interpreteert. Het is gebaseerd op de Unix- shell en werd geschreven voor het GNU- project . Het is de standaard commando-interpreter in de meeste GNU/Linux- distributies . De naam is een acroniem voor Bourne-Again Shell , een woordspeling (born-again betekent wedergeboorte) die verwijst naar de Bourne shell (sh) , een van de eerste belangrijke Unix-interpreters.

Vandaag laten we je een aantal shellscripts zien die erg handig kunnen zijn voor ontwikkelaars. De meeste werken in elke Unix- shell, hoewel sommige specifiek Bash vereisen.

Voorkom dat niet-bevoegde gebruikers het script uitvoeren

Sommige scripts voeren administratieve taken uit, dus we willen misschien dat alleen de rootgebruiker het script uitvoert. In dat geval kunnen we zoiets als dit gebruiken:

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

Sta scriptuitvoering alleen toe aan een specifieke gebruiker

Net als bij de bovenstaande code, willen we misschien dat alleen een specifieke gebruiker het script uitvoert. We doen het zo:

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

Controleer of een service / proces actief is

Als we willen weten of er processen van een service of programma actief zijn, kunnen we dit script gebruiken (in dit geval controleert het of de Apache- daemon actief is) :

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

Maak een vergrendelingsbestand

Soms moeten we ervoor zorgen dat het script niet twee of meer keer tegelijk wordt uitgevoerd. Hiervoor kunnen we gebruik maken van de lock files. Dit is een eenvoudige versie van een script waarmee we dit kunnen doen:

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

In dit geval controleert het script of het bestand `loquesea.lock` bestaat. Zo ja, dan voert het script zijn taken NIET uit. Zo nee, dan maakt het script het bestand aan, voert de benodigde taken uit en verwijdert het vervolgens. Dit is echter niet geheel betrouwbaar. Wat zou er gebeuren als ons script abrupt zou worden afgesloten terwijl het nog draait?

In dat geval wordt het vergrendelingsbestand niet verwijderd en kunnen we het script daarom niet opnieuw uitvoeren. Om die gevallen te dekken, kunnen we gebruik maken van het trap-commando waarmee we commando's kunnen uitvoeren voor het geval ons script onverwachts eindigt. Dit is een meer geavanceerde versie die ook de PID opslaat van het script dat het uitvoert in het vergrendelingsbestand:

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

Laten we het `trap` -commando eens wat beter bekijken . De syntaxis is in principe als volgt: `trap command signal [signal …];`, waarbij `signal` het beëindigingssignaal is dat je wilt vastleggen. Als je een lijst met beschikbare signalen wilt zien, kun je het commando `kill -l` uitvoeren. In het vorige voorbeeld werden de volgende signalen gebruikt: `INT` (legt het beëindigingssignaal vast dat wordt gegenereerd door Ctrl+c) , `TERM` (beëindiging door het `kill`-commando) en `EXIT` (normale beëindiging van het script, omdat er geen regels meer zijn om uit te voeren of omdat het het `exit`-commando tegenkomt).

Optiemenu

Om een ​​menu te maken waarin we de gebruiker een reeks opties laten selecteren, kunnen we het volgende schema gebruiken:

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

Vraag om bevestiging voordat u een script uitvoert

Soms is het handig om de gebruiker de uitvoering van een reeks instructies te laten bevestigen, dat wil zeggen het typische bericht dat de gebruiker vraagt ​​om ja of nee in te typen. We kunnen dit als volgt doen:

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

Einde artikel. Gewoon geweldig 

Edit: Ik moet opletten met spaties en tabs, want om de een of andere reden krijg ik ze niet goed ¬¬


Voeg dit toe als voorkeursbron in Google.