Bash — це комп'ютерна програма, функція якої полягає в інтерпретації команд. Вона базується на оболонці Unix та була написана для проєкту GNU , будучи інтерпретатором команд за замовчуванням у більшості дистрибутивів GNU/Linux . Її назва є абревіатурою від Bourne-Again Shell , гри слів (born-again означає відродження), що посилається на оболонку Bourne (sh) , яка була одним з перших основних інтерпретаторів Unix.
Сьогодні ми покажемо вам деякі скрипти оболонки, які можуть бути дуже корисними для розробників. Більшість із них працюють у будь-якій оболонці Unix , хоча деякі вимагають спеціального запуску Bash.
Заборонити непривілейованим користувачам запускати сценарій
Деякі сценарії виконують адміністративні завдання, тому нам може знадобитися, щоб сценарій запускав лише користувач root. У цьому випадку ми можемо використовувати щось на зразок цього:
#!/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"
Кінець статті. Просто чудово
Редагування: Мені потрібно бути обережним з пробілами та табуляцією, бо з якоїсь причини я не правильно їх пишу ¬¬