Bash je računarski program čija je funkcija interpretiranje naredbi. Baziran je na Unix shell-u i napisan je za GNU projekat , te je podrazumijevani interpreter naredbi u većini GNU/Linux distribucija . Njegovo ime je akronim za Bourne-Again Shell , igru riječi (born-again znači ponovno rođenje) koja se odnosi na Bourne shell (sh) , koji je bio jedan od prvih glavnih Unix interpretera.
Danas ćemo vam pokazati neke shell skripte koje mogu biti vrlo korisne za programere. Većina njih radi u bilo kojem Unix shell-u, iako neki zahtijevaju da se Bash pokreće posebno.
Spriječite neprivilegiranim korisnicima pokretanje skripte
Neke skripte izvršavaju administrativne zadatke pa bismo možda željeli da samo skriveni korisnik pokrene root korisnika. U tom slučaju možemo koristiti nešto poput ovog:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi
Omogućite izvršavanje skripte samo određenom korisniku
Slično gore navedenom kodu, možda bismo željeli da samo određeni korisnik pokrene skriptu. Činimo to tako:
#!/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
Provjerite je li usluga / proces pokrenut
Ako želimo znati da li se izvršavaju neki procesi iz servisa ili programa, možemo koristiti ovaj skript (u ovom slučaju, provjerava se da li je pokrenut Apache daemon ) :
#!/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
Stvorite datoteku zaključavanja
Ponekad moramo biti sigurni da se skripta ne pokreće dva ili više puta istovremeno. Za ovo možemo koristiti datoteke zaključavanja. Ovo je jednostavna verzija skripte koja nam omogućava da to učinimo:
#!/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
U ovom slučaju, skripta provjerava da li datoteka `loquesea.lock` postoji. Ako postoji, skripta NE izvršava svoje zadatke. Ako ne postoji, kreira datoteku, izvršava potrebne zadatke, a zatim je briše. Međutim, ovo nije u potpunosti pouzdano. Šta bi se dogodilo ako bi se naša skripta naglo zatvorila dok je radila?
U tom slučaju datoteka zaključavanja neće biti izbrisana i stoga nam neće dopustiti da ponovo pokrenemo skriptu. Da bismo pokrili te slučajeve, mogli bismo se poslužiti naredbom trap koja nam omogućava izvršavanje naredbi u slučaju da naša skripta završi neočekivano. Ovo je naprednija verzija koja također sprema PID skripte koja ga izvršava u datoteci zaključavanja:
#!/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
Hajde da malo bolje razumijemo naredbu `trap` . Njena sintaksa je u osnovi sljedeća: `trap naredba signal [signal …];` gdje je `signal` signal završetka koji želite snimiti. Ako želite vidjeti listu dostupnih signala, možete pokrenuti naredbu `kill -l`. U prethodnom primjeru, korišteni signali bili su `INT` (hvata signal završetka koji proizvodi Ctrl+c) , `TERM` (završetak koji proizvodi naredba `kill`) i `EXIT` (normalan završetak skripte, bilo zato što nema više linija za izvršenje ili zato što nailazi na naredbu `exit`).
Izbornik opcija
Da bismo napravili meni u kojem dopuštamo korisniku da odabere niz opcija, možemo koristiti sljedeću shemu:
#!/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
Zatražite potvrdu prije pokretanja skripte
Ponekad je korisno da korisnik potvrdi izvršenje serije naredbi, to jest tipične poruke koja od korisnika traži da unese da ili ne. Možemo to učiniti ovako:
#!/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"
Kraj članka. Jednostavno odlično
Izmjena: Moram biti oprezan s razmacima i tabulatorima, jer ih iz nekog razloga ne koristim kako treba.