Полезные сценарии оболочки в любой программе

Bash — это компьютерная программа, функция которой заключается в интерпретации команд. Она основана на оболочке Unix и была написана для проекта GNU , являясь интерпретатором команд по умолчанию в большинстве дистрибутивов GNU/Linux . Её название — это аббревиатура от Bourne-Again Shell (оболочка Борна) , игра слов (born-again означает возрождение), отсылающая к оболочке Борна (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"

Конец статьи. Просто великолепно 

Редактирование: Мне нужно быть внимательнее с пробелами и табуляцией, потому что по какой-то причине я их неправильно использую ¬¬


Добавить в качестве предпочтительного источника в Google