Το Bash είναι ένα πρόγραμμα υπολογιστή του οποίου η λειτουργία είναι η ερμηνεία εντολών. Βασίζεται στο κέλυφος Unix και γράφτηκε για το έργο GNU , όντας ο προεπιλεγμένος διερμηνέας εντολών στις περισσότερες διανομές GNU/Linux . Το όνομά του είναι ακρωνύμιο του Bourne-Again Shell , ένα λογοπαίγνιο (born-again που σημαίνει αναγέννηση) που αναφέρεται στο κέλυφος Bourne (sh) , το οποίο ήταν ένας από τους πρώτους σημαντικούς διερμηνείς Unix.
Σήμερα θα σας δείξουμε μερικά shell scripts που μπορούν να φανούν πολύ χρήσιμα για τους προγραμματιστές. Τα περισσότερα από αυτά λειτουργούν σε οποιοδήποτε shell Unix , αν και μερικά απαιτούν την εκτέλεση του Bash ειδικά.
Αποτρέψτε τους μη προνομιούχους χρήστες από την εκτέλεση του σεναρίου
Ορισμένα σενάρια εκτελούν διοικητικές εργασίες, οπότε ίσως θέλουμε μόνο ο ριζικός χρήστης να εκτελέσει το σενάριο. Σε αυτήν την περίπτωση μπορούμε να χρησιμοποιήσουμε κάτι σαν αυτό:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi
Να επιτρέπεται η εκτέλεση σεναρίου μόνο σε συγκεκριμένο χρήστη
Παρόμοια με τον παραπάνω κώδικα, ίσως θέλουμε μόνο ένας συγκεκριμένος χρήστης να εκτελέσει το σενάριο. Το κάνουμε έτσι:
#!/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
Βεβαιωθείτε ότι εκτελείται μια υπηρεσία / διαδικασία
Αν θέλουμε να μάθουμε αν εκτελούνται διεργασίες από μια υπηρεσία ή ένα πρόγραμμα, θα μπορούσαμε να χρησιμοποιήσουμε αυτό το σενάριο (σε αυτήν την περίπτωση, ελέγχει ότι εκτελείται ο δαίμονας Apache ) :
#!/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
Δημιουργήστε ένα αρχείο κλειδώματος
Μερικές φορές πρέπει να βεβαιωθούμε ότι το σενάριο δεν εκτελείται δύο ή περισσότερες φορές ταυτόχρονα. Γι 'αυτό μπορούμε να χρησιμοποιήσουμε τα αρχεία κλειδώματος. Αυτή είναι μια απλή έκδοση ενός σεναρίου που μας επιτρέπει να το κάνουμε:
#!/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
Σε αυτήν την περίπτωση, το σενάριο ελέγχει εάν το αρχείο `loquesea.lock` υπάρχει. Εάν υπάρχει, το σενάριο ΔΕΝ εκτελεί τις εργασίες του. Εάν δεν υπάρχει, δημιουργεί το αρχείο, εκτελεί τις απαραίτητες εργασίες και στη συνέχεια το διαγράφει. Ωστόσο, αυτό δεν είναι απολύτως αξιόπιστο. Τι θα συνέβαινε εάν το σενάριό μας έκλεινε απότομα ενώ εκτελούνταν;
Σε αυτήν την περίπτωση, το αρχείο κλειδώματος δεν θα διαγραφεί και επομένως δεν θα μας επιτρέπει να εκτελέσουμε ξανά το σενάριο. Για να καλύψουμε αυτές τις περιπτώσεις, θα μπορούσαμε να χρησιμοποιήσουμε την εντολή παγίδας που μας επιτρέπει να εκτελέσουμε εντολές σε περίπτωση που το σενάριό μας τελειώσει απροσδόκητα. Αυτή είναι μια πιο προηγμένη έκδοση που αποθηκεύει επίσης το PID του σεναρίου που το εκτελεί στο αρχείο κλειδώματος:
#!/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
Ας κατανοήσουμε λίγο καλύτερα την εντολή `trap` . Η σύνταξή της είναι βασικά η εξής: `trap command signal [signal …];` όπου `signal` είναι το σήμα τερματισμού που θέλετε να καταγράψετε. Αν θέλετε να δείτε μια λίστα με τα διαθέσιμα σήματα, μπορείτε να εκτελέσετε την εντολή `kill -l`. Στο προηγούμενο παράδειγμα, τα σήματα που χρησιμοποιήθηκαν ήταν `INT` (καταγράφει το σήμα τερματισμού που παράγεται από το Ctrl+c) , `TERM` (τερματισμός που παράγεται από την εντολή `kill`) και `EXIT` (κανονικός τερματισμός σεναρίου, είτε επειδή δεν υπάρχουν άλλες γραμμές προς εκτέλεση είτε επειδή συναντά την εντολή `exit`).
Μενού επιλογών
Για να δημιουργήσετε ένα μενού όπου επιτρέπουμε στον χρήστη να επιλέξει μια σειρά επιλογών, μπορούμε να χρησιμοποιήσουμε το ακόλουθο σχήμα:
#!/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
Ζητήστε επιβεβαίωση πριν εκτελέσετε ένα σενάριο
Μερικές φορές είναι χρήσιμο να επιβεβαιώνετε ο χρήστης την εκτέλεση μιας παρτίδας δηλώσεων, δηλαδή το τυπικό μήνυμα που ζητά από τον χρήστη να πληκτρολογήσει ναι ή όχι. Μπορούμε να το κάνουμε έτσι:
#!/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"
Τέλος άρθρου. Απλά υπέροχο
Επεξεργασία: Πρέπει να είμαι προσεκτικός με τα κενά και τους στηλοθέτες, επειδή για κάποιο λόγο δεν τα χρησιμοποιώ σωστά.