Bash е компютърна програма, чиято функция е да интерпретира команди. Тя е базирана на Unix shell и е написана за проекта GNU , като е интерпретаторът на команди по подразбиране в повечето GNU/Linux дистрибуции . Името ѝ е акроним от Bourne-Again Shell , игра на думи (born-again означава прераждане), препращаща към Bourne shell (sh) , който е един от първите големи Unix интерпретатори.
Днес ще ви покажем някои shell скриптове, които могат да бъдат много полезни за разработчиците. Повечето от тях работят във всяка Unix shell, въпреки че някои изискват 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` съществува. Ако съществува, скриптът НЕ изпълнява задачите си. Ако не съществува, той създава файла, изпълнява необходимите задачи и след това го изтрива. Това обаче не е напълно надеждно. Какво би се случило, ако нашият скрипт бъде внезапно затворен, докато се изпълнява?
В този случай заключващият файл няма да бъде изтрит и следователно няма да ни позволи да стартираме скрипта отново. За да покрием тези случаи, бихме могли да използваме командата trap, която ни позволява да изпълняваме команди, в случай че скриптът ни приключи неочаквано. Това е по-усъвършенствана версия, която също записва 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"
Край на статията. Просто страхотно
Редактиране: Трябва да внимавам с интервалите и табулациите, защото по някаква причина не ги използвам правилно ¬¬