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. Заметьте, что не требуется при определении каждой одиночной опции указывать дефис.