Выбрать главу

TRCASE=lower

EXT=".LC"

OPT=yes

shift

;;

-help) echo "convert a file(s) to uppercase from lowercase" echo "convert a file(s) from lowercase to uppercase" echo "will convert all characters according to the" echo " specified command option," echo " Where option ls"

echo " -l Convert to lowercase"

echo " -uConvert to uppercase"

echo " The original file(s) ls not touched. A new file(s)"

echo "will be created with either a. UC or. LC extension"

echo "usage; $0 -[l|u] file [file..]"

exit 0

;;

-*) echo "usage: `basename $0` -[l|u] file [file..]"

exit 1

;;

*) # сбор файлов для обработки

if [ -f $1]

then

# добавьте имена файлов в список переменных

FILES=$FILES" "$1

else

echo "`basename $0`: Error cannot find the file $1"

fi

shift

;;

esac

done

# опции не заданы… помогите пользователю

if [ "$OРТ"="no" ]

then

echo "`basename $0`: Error you need to specify an option. No action taken"

echo " try `basename $0` --help"

exit 1

fi

#просмотр всех файлов

#используется переменная LOOP, такое красивое слово LOOP

for LOOP in $FILES

do

case $TRCASE in

lower) cat $LOOP | tr "[a‑z]" "[A‑Z]" >$LOOP$EXT

if [ $? != 0 ]

then

error_msg $LOOP

else

echo "Converted file called $LOOP$EXT"

fi

;;

upper} cat $LOOP|tr "[A‑Z]" "[a‑z]" >$LOOP$EXT

if [ $? != 0 ]

then

error_msg $LOOP

else

echo "Converted file called $LOOP$EXT"

fi

;;

esac

done

Если выполнять указанный сценарий с различными опциями в качестве входных данных, получим следующие результаты.

При передаче имени несуществующего файла:

$ tr_case -k cursor

usage: shiftl -[l|u] file [file..}

При передаче некорректных опций:

$ tr_case cursor

tr case:Error you need to specify an option. No action taken try tr_case -help

Если просто указать имя файла в надежде на ответную помощь сценария, результатом будет:

$ tr_case

For more info try tr_case -help

Если указать два имени существующих файлов, а третье — имя несуществующего файла, получим следующие результаты:

$ tr_case -l cursor sd ascii

tr case: Error cannot find the file sd

Converted file called cursor.LC

Converted file called ascii.LC

С помощью указанного сценария можно осуществить преобразование к одному и тому же регистру символов из нескольких файлов. Сценарий, который сможет обрабатывать различные опции командной строки, будет иметь большой размер.

Предположим, что существует сценарий, выполняющий обработку различных опций командной строки:

command -1 -с 23 -v файл1 файл2

Здесь нельзя применить команду shift; вместо нее следует воспользоваться командой getopts.

20.2. Команда getopts

Применение команды getopts обеспечивает создание программного кода, который без труда справляется с несколькими аргументами командной строки. Благодаря использованию этой команды процесс обработки командной строки приводится в соответствие с некоторым стандартом. Ведь сценарии должны соответствовать стандартному формату (файлов командных опций.

20.2.1. Пример сценария, использующего команду getopts

С командой getopts лучше ознакомиться на основе примеров. Ниже приводится простой сценарий getopts, использующий следующие параметры, или аргументы:

-a Переменной all присваивается значение "истина"
-h Переменной help присваивается значение "истина"
-f Переменной file присваивается значение "истина"
-v Переменной verbose присваивается значение "истина'

Как обычно, при всех установках переменных всегда предполагается худший вариант, поэтому изначально переменным присваивается значение "ложь":

$ pg getopt1

#/bin/sh #getopt1

# присвоение значений переменным

ALL=false

HELP=false

FILE=false

VERBOSE=false

while getopts ahfgv OPTION do

case $OPTION in

a)ALL=true

echo "ALL is $ALL"

;;

h)HELP=true

echo "HELP is $HELP"

;;

f)FILE=true

echo "FILE is $FILE"

;;

v)VERBOSE=true

echo "VERBOSE is $VERBOSE"

;;

esac

done

Общий формат команды getopts:

getopts строка_параметров переменная

А теперь используем код из нашего примера:

while getopts ahfgv OPTION

Нетрудно заметить, что цикл while применяется для считывания в командной строке. Параметр строка параметров включает пять указанных опций (-a, —h, —f, —g, —v), а также переменную, которая в данном примере именуется OPTION. Заметьте, что не требуется при определении каждой одиночной опции указывать дефис.