Команда 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";;
4|04|Apr)_FULL="April";;
5|05|May)_FULL="May";;
6|06|Jun)_FULL="June";;
7|07|Jul)_FULL="July";;
8|08|Aug)_FULL="August;;
9|09|Sep|Sept)_FULL="September";;
10|Oct)_FULL="October";;
ll|Nov)_FULL="November;;
l2|Dec)_FULL="December";;
*) echo "months: Unknown month"
return 1
;;
esac
echo $_FULL
}
Для вызова функции months можно применить одни из следующих методов.
months 04
В результате отобразится наименование месяца "April". Можно также вызвать функцию из сценария:
MY_MONTH=`months 06`
echo "Generating the Report for Month End $MY_MOMTH"