Следующая функция реализует обобщенный запрос. Пользователь указывает отображаемое сообщение, а также ответ, выбираемый по умолчанию. Ответ, выбираемый по умолчанию, используется в том случае, если пользователь просто нажал клавишу [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
Получение сведений об идентификаторе регистрации
При работе в составе большой системы может возникнуть необходимость связаться с одним из зарегистрированных пользователей. Что делать в том случае, если вы не помните имя пользователя? Часто системные администраторы наблюдают идентификаторы пользователей, блокирующих какие‑либо процессы. Для того чтобы увидеть полное имя пользователя, они должны просмотреть файл passwd с помощью команды grep. И только после этого можно связаться с пользователем, чтобы сделать ему справедливый выговор.
А сейчас мы рассмотрим функцию, которая позволит избежать просмотра файла /etc/passwd с помощью команды grep.
В тестовой системе полное имя пользователя хранится в пятом поле файла passwd; в вашей системе все может быть по–другому, поэтому, возможно, придется изменить номер поля, чтобы обеспечить соответствие с файлом passwd.
Функции передается один либо множество идентификаторов Пользователей, а функция имитирует действие команды grep по отношению к файлу passwd.
Программный код функции:
whois ()
#whois
#вызов: whois идентификатор_пользователя
{
# проверка на наличие корректных параметров
if [ $# -lt 1 ]; then
echo "whois : need user id's please"
return 1
fi
for loop do
_USER_NAME=`grep $LOOP /etc/passwd | awk -F: '(print $4}'`
if [ "$_USER_NAME"="" ]; then
echo "whois: Sorry cannot find $LOOP"
else
echo "$LOOP is $_USER_NAME" fi
done
}