оператора if В сценарии позволит определить, будет ли передаваемая строка включать прописные символы.
Программный код функции:
is_upper ()
#is_upper
#вызов: is_upper $1
{
# проверка на наличие корректных параметров
if [ $# -ne 1 ]; then
echo "is_upper: I need a string to test OK"
return 1
fi
# применение awk для проверки на наличие прописных символов
_IS_UPPER=`echo $1 | awk '{if($0~/[^A‑Z]/) print "1"}`
if [ "$_IS_UPPER" != "" ]
then
# нет, не все символы являются прописными
return 1
else
# да, все символы являются прописными
return 0
fi }
При вызове функции is_upper укажите строковый аргумент. На примере показано, как вызывается функция.
echo -n "Enter the filename :"
read FILENAME
if ls_upper $FILENAME; then
echo "Great it's upper case" else
echo "Sorry it's not upper case" fi
Для проверки наличия в строке строчных символов просто замените существующую конструкцию awk а функции is_upper и измените имя функции на is_lower.
_IS_LOWER=`echo $1 |awk '{ if ($0~/[^a‑z] /) print "1"}`
Преобразование символов строки в строчные символы
В предыдущем разделе мы рассмотрели функцию str_to_upper, а теперь речь пойдет о функции str_to_lower. Вот код самой функции:
str_to_lower ()
#str_to_lower
#вызов: str_to_lower $1
{
#проверка на наличие корректных параметров
if [ $# -ne 1 ]; then
echo "str_to_lower: I need a string to convert please"
return 1
fi
echo $@ | tr '[A‑Z]' '[a~z]'
}
Переменная lower хранит возвращенное значение строки, содержащей строчные символы. Обратите внимание на повторное использование специального параметра $@ для передачи всех аргументов. Функция str_to_lower может быть вызвана двумя способами. Во–neрвых, можно указать строку в сценарии:
LOWER=`str_to_lower "documents.live"`
echo $LOWER
Альтернативный вариант — указать аргумент для функции вместо задания строки:
LOWER=`str_to_lower $1`
echo $LOWER
Определение длины строки
Проверка результата ввода в поле является общей задачей, выполняемой сценариями. Процесс проверки может включать множество частных задач, например определение того, является ли ввод числовым или только символьным. При этом также может проверяться формат либо длина поля.
Предположим, что имеется сценарий, в рамках которого пользователь вводит данные в поле имени с помощью интерактивного экрана. В этом случае часто возникает необходимость проверить, может ли поле включать лишь определенное количество символов, например 20 символов для ввода имени персоны. Ведь пользователю не так уж трудно ввести и 50 символов в это поле. Ниже приведен код функции, осуществляющей подобную проверку. Этой функции могут быть переданы два параметра: фактическая строка и максимально возможная длина строки.
Вот сама функция:
check_length()
#check_length
#вызов: check_length строка максимальная_длина_строки
{
_STR=$1
_МАХ=$2
# проверка на наличие корректных параметров
if [ $# -ne 2 ]; then
echo "check_length: I need a string and max length the string should be" return 1
fi
# проверка длины строки
_LENGTH=`echo $_STR |awk '{print length ($0)}'`
if [ "$_LENGTH" -gt "$_MAX" ]; then
# длина строки слишком велика
return 1
else
# строка имеет обычную длину
return О
fi }
Функция check length может быть вызвана следующим образом:
$ pg test_name
#!/bin/sh
# test name
while : do
echo -n "Enter your FIRST name :"
read NAME
if check_length $NAME 10
then break.
# ничего не происходит, если все условия выполнены else
echo "The name field ls too long 10 characters max"
fi
done
Цикл продолжает выполняться до тех пор, пока данные, вводимые для переменной NAME, меньше, чем значение переменной MAX (эта переменная содержит количество разрешенных символов; в данном случае речь идет о 10 символах). Команда break позволяет завершить выполнение цикла.
При использовании приведенного выше фрагмента кода, вывод будет следующим:
$ val_max
Enter your FIRST name :Pertererrrrrrrrrrrrrrr
The name field ls too long 10 characters max
Enter your FIRST name :Peter
Команда wc также может применяться для определения длины строки, но имейте в виду следующий факт. При использовании команды wc для обработки результатов ввода с клавиатуры могут появиться проблемы. Если после ввода имени несколько раз нажать клавишу пробела, то, как правило, некоторые пробелы будут учитываться в качестве части строки. По этой причине будет определяться некорректная длина строки. Утилита awk "обрезает" конечные пробелы в строке при осуществлении ввода с клавиатуры (эта функция задана по умолчанию).
Ниже приведен пример, иллюстрирующий сказанное:
echo -n "name :"
read NAME
echo $NAME | wc -c
Результат выполнения описанного фрагмента сценария (здесь [] является пробелом):
name : Peter[][]
Функция chop
Функция chop удаляет символы в начале строки. Этой функции передается строка; пользователь указывает, сколько символов необходимо "обрезать", начиная с первого символа. Предположим, что имеется строка mydocument.doc и требуется "обрезать" часть mydocument, в результате чего функция будет возвращать только часть .doc. При этом функции chop могут быть переданы следующие параметры:
MYDOCUMENT.DOC 10
Код функции chop:
chop () # chop
# вызов: chop строка количество_обрезаемых_символов
#
STR=$1
_CHOP=$2
# подстрока awk, начинается с 0, нам потребуется прирастить ее на единицу # для отображения того, что если пользователь задал обрезание 2 символов, 2 символа будут удалены а не 1
CHOP=`expr $_CHOP + 1`
#проверка на корректность параметров
if [ $# -ne 2 ]; then
echo "check_length: I need a string and how many characters to chop"
return 1
fi
# первоначальная длина строки
# мы не можем обрезать больше символов, чем содержится в строке!!
_LENGTH=`echo $_STR | awk '{print length ($0)}'`
if [ "$_LENGTH" — lt "$_CHOP" ]; then
echo "Sorry you have asked to chop more characters than there are in the string"
return 1
fi
echo $_STR | awk '(print substr ($1, '$_CHOP')}'
}
Возвращаемая строка, которая была "обрезана", присваивается переменной chopped. Для вызова функции chop используется следующая последовательность:
CHOPPED=`chop "Honeysuckle" 5`
echo $CHOPPED
suckle
Вызов также можно осуществить другим способом:
echo -n "Enter the Filename :"
read FILENAME
CHOPPED=`chop $FILENAME 1`
# первый символ будет обрезан !
Функция months
При создании отчетов либо при отображении информации на экране часто удобным для программистов является использовании быстрого метода отображения полных наименований месяцев. Функция months в качестве аргумента использует номер месяца либо его аббревиатуру и затем возвращает полное наименование месяца.
Например, использование в качестве аргумента значения 3 либо 03 приведет к возврату значения "March". Вот описание самой функции:
months () {
# months
_MONTH=$1
# проверка на наличие корректных параметров
if [ $# -ne 1 ]; then
echo "months: I need a number 1 to 12 "
return 1
fi
case $_MONTH in
1|01|Jan)_FULL="January";;
2|02|Feb)_FULL="February";;
3|03|Mar)_FULL="March";;