Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:
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, либо, в крайнем случае, использовать переменную, содержащую строку. Также может передаваться
Ниже демонстрируется несколько методов, с помощью которых можно вызвать функцию 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
}
Функция whois
может быть вызвана следующим образом:$ whois davs peters superman
dave ls David Tansley — admin accts
peter ls Peter Stromer -customer services
whois: Sorry cannot find superman
Использование нумерации в текстовом файле
При использовании редактора vi появляется возможность нумерации строк. Это полезно в целях отладки, но при выводе на печать некоторых файлов с номерами строк потребуется команда nl. Ниже приведена функция, имитирующая действие команды nl (выполняет нумерацию строк файла). Исходный файл при этом не перезаписывается. Вот программный код функции.
number_file
#number_file
#вызов: number_file имя_файла {
_FILENAME=$1
# проверка наличия корректных параметров
if [ $# -ne 1 ]; then
echo "number_flie: I need a filename to number"
return 1
fi
loop=1
while read LINE do
echo "$LOOP: $LINE" loop=`expr $LOOP + 1`
done < $_FILENAME
}
Для вызова функции number_file просто укажите имя файла, подлежащего нумерации, в качестве аргумента функции. Вызов функции может также осуществляться из среды интерпретатора shell путем указания имени файла. Например:
$ number_file myfile
Кроме того, функцию можно вызвать из сценария, воспользовавшись с этой целью предыдущим примером. Или вы можете задать оператор:
$.number_file $1
Результат выполнения функции может выглядеть следующим образом:
$ number_file /home/dave/file_listing
1: total 105
2: -rw-r—r—- 1 dave admin 0 Jun 6 20:03:DT
3: -rw-r--r-- 1 dave admin 306 May 23 16:00 LPSO. AKS
4: -rw-r--r-- 1 dave admin 306 May 23 16:00 LPSO. AKS. UC
5: -rw-r--r-- 1 dave admin 324 May 23 16:00 LPSO. MBB
6: -rw-r--r-- 1 dave admin 324 May 23 16:00 LPSO. MBB. UC
7: -rw-r--r-- 1 dave admin 315 May 23 16:00 LPSO. MKQ
Преобразование символов в прописные
Иногда возникает потребность в преобразовании строчных символов в прописные. Например, для создания каталогов в файловой системе используются прописные символы. Кроме того, при вводе данных в поля может выполняться проверка, являются ли все символы прописными.
Ниже приводится соответствующая функция. Эта функция имитирует действие команды tr:
str_to_upper
#str_to_upper
# вызов: str_to_upper $1
{
STR=$1
# проверка на наличие корректных параметров
if [ $# -ne 1 ]; then
echo "number_file: I need a string to convert please"
return 1
fi
echo $@ |tr '[a-z]' '[A-Z]'
Переменной upper присваивается строка, символы которой преобразованы в прописные символы. Обратите внимание, что снова применяется специальный символ $@ для передачи всех аргументов. Функция str_to_upper может вызываться двумя способами. Можно указать строку в сценарии следующим образом: