Шрифт:
echo " In case you are wondering you pressed $character"
Проверка наличия каталога
Проверка наличия каталогов является весьма распространенной задачей, возникающей при копировании файлов. Приведенная ниже функция проверяет имя файла, переданное функции, что позволяет установить наличие каталога. Поскольку в этом случае используется команда return с параметром, изменяющимся в зависимости от успеха или неудачи при выполнении команды, для проверки результатов наиболее удачным является выбор конструкции if.
is_it_a_directory
{
# is_it_a_directorу
# вызов: is_it_a_directory имя_каталога
if [ $# -lt 1 ]; then
echo "is_it_a_directory: I need an argument" return 1 fi
# это каталог ?
_DIRECTORY_NAME=$1
if [ !
– d $_DIRECTORY_NAME ]; then
# нет
return 1
else
# да
return 0
fi
}
Для вызова функции и проверки результата можно воспользоваться кодом:
echo -n "enter destination directory :"
read DIREC
if is_it_a_directory $DIREC;
then :
else
echo "$DIREC does not exist, create it now? [y..n]"
# здесь должны находится команды для создания каталога или для выхода
fi
Запрос на ввод Y или N
Многие сценарии выдают запрос на ввод подтверждения перед выполнением дальнейшей обработки. Запрос может выглядеть следующим образом:
Create a directory
Do you wish to delete this file
Run the backup now
Confirm to save a record
Этот перечень может быть достаточно длинным.
Следующая функция реализует обобщенный запрос. Пользователь указывает отображаемое сообщение, а также ответ, выбираемый по умолчанию. Ответ, выбираемый по умолчанию, используется в том случае, если пользователь просто нажал клавишу [Return]. Конструкция case применяется для перехвата ответов.
continue_prompt
#continue_prompt
#вызов: continue_prompt "отображаемая_строка" ответ_по_умолчанию
{
_STR=$1
_DEFAULT=$2
# проверка на предмет указания правильных параметров
if [ $# -lt 1 ]; then
echo "continue_prompt: I need a string to display"
return 1
fi
# бесконечный цикл
while :
do
echo -n "$_STR [Y..N] [$_DEFAULT]:" read _ANS
#если пользователь нажал [Return], устанавливаются настройки
#по умолчанию и определяется возвращаемое значение,
#ниже находится пробел, а затем символ $
: ${_ANS:=S_DEFAULT}
if [ "$_ANS" = "" ]; then
case $_ANS in
Y) return 0 ;;
N) return 1 ;;
esac
fi
# пользователь что-то выбрал
case $_ANS in
y|Y|Yes|YES)
return 0
;;
n|N|No|NO)
return 1
;;
*) echo "Answer either Y or N, default is $_DEFAULT"
;;
esac
echo $_ANS
done }
Для вызова функции можно указать отображаемое сообщение в двойных кавычках либо вызвать ее вместе с аргументом $1, либо, в крайнем случае, использовать переменную, содержащую строку. Также может передаваться ответ, заданный по умолчанию, в виде 'Y' или 'N'.
Ниже демонстрируется несколько методов, с помощью которых можно вызвать функцию continue_prompt.
if continue_prompt "Do you want to delete the var filesytem" "N"; then
echo "Are you nuts!!"
else
echo "Phew, what a good answer!"
fi
При использовании этого кода можно указывать следующий ввод:
Do you really want to delete the var filesystem [Y..N] [N] :
Phew, what a good answer!
Do you really want to delete the var filesystem [Y..N] [N] :y
Are you nuts!!
Теперь вам понятно, почему функция имеет ответ, заданный по умолчанию. Причем этот ответ может задавать сам пользователь!
Ниже приводится другой способ вызова функции:
#if continue_prompt "Do you really want to print this report" "Y"; then
lpr report
else:
fi
Функцию можно также вызвать с использованием переменной $1, содержащей строку:
if continue_prompt $1 "Y"; then
lpr report
else :
fi
Получение сведений об идентификаторе регистрации