20.1.3. Преобразования файла с помощью команды shift
20.1.3. Преобразования файла с помощью команды shift
Использование возможностей команды shift значительно облегчает работу с опциями командной строки. Рассмотрим сценарий, выполняющий преобразование регистра символов. При этом будет применяться команда tr.
При выполнении сценария используются две опции:
-l для нижнего регистра -u для верхнего регистра
С помощью команды shift можно запустить на выполнение сценарий, работающий с опциями -l и -u. Ниже приводится первый вариант этого сценария.
$ pg tr_case
#!/bin/sh
#tr_case
#преобразование регистра usage ()
{
# сообщение usage
echo "usage:`basename $0` -[l|u] file [files]" >&2
exit 1
}
if [ $# -eq 0 ]; then
# параметры не переданы!
usage
fi
while [ $# -gt 0 ]
do
case $1 in
-u|-U) echo " -uoption specified"
# здесь укажите все установки переменных для нижнего регистра, затем
# примените команду shift shift
;;
-l|-L) echo " -l option specified"
# здесь укажите все установки переменных для верхнего регистра, затем
# примените команду shift shift
;;
*) usage
;;
esac
done
Вначале выполняется проверка, имеются ли аргументы в сценарии. Если они отсутствуют, выводится сообщение usage. При обработке аргументов с помощью конструкции case отображается значение каждой передаваемой опции. После этого применяется команда shift, выполняющая вывод в командной строке очередной опции. Если все опции обработаны, отображается сообщение usage.
А теперь посмотрим, как выглядят выводимые результаты при передаче сценарию двух некорректных аргументов.
$ tr_case -u -l -к
— и option specified
-l option specified
usage: tr_case —[l|u] file [files]
На следующем этапе обрабатываются файлы, передающиеся после обработки опций с помощью конструкции case. Для реализации этой задачи достаточно выполнить небольшие изменения. В конструкции case шаблон * заменяется шаблоном -*, что позволяет передавать некорректные опции, например -p или -q.
Чтобы с помощью цикла for обрабатывать каждый файл, следует для всех передаваемых имен файлов указывать шаблон *. Кроме того, с помощью опции -f проверяется наличие всех требуемых имен файлов.
Итак, улучшенный вариант конструкции case имеет следующий вид:
case
...
-*) usage
*) if [ -f $1 ]; then
FILES=$FILES" "$1 # присвоить переменной имена файлов
else
echo "`basename $0` cannot find the file $1"
fi
shift # получите следующий параметр !
esac
Следует также задать значения некоторых переменных в зависимости от указанной опции (-1, — u). При этом используются следующие переменные:
TRCASE Указывает тип преобразования регистра (верхний или нижний регистр) ЕХТ Все преобразованные файлы имеют либо расширение .UC (для верхнего регистра), либо расширение .LC (для нижнего регистра). В исходный файл изменения не вносятся OPT При передаче опций принимает значение yes, в противном случае — no. Только тогда, когда опции не передаются, можно перехватить их значение и вывести на экран сообщение
Для выполнения реального преобразования достаточно добавить еще один фрагмент кода, включающий команду tr. Этот фрагмент кода добавляется в конец сценария. При этом для считывания имен файлов используется цикл for и конструкция case. Ниже приводится код созданного сценария:
$ pg tr_case
#!/bin/sh
#tr_case
#преобразование символов файлов либо в верхний, либо в нижний регистр
FILES=""
TRCASE=""
EXT=""
OPT=no
# вызывается при неудачном преобразовании
error_msg ()
{
_FILENAME=$1
echo "`basename $0`: Error the conversion failed on $_FILENAME"
}
if [ $# -eq 0 ] then
echo "For more info try `basename $0` —help"
exit 1
fi
while [ $# -gt 0 ]
do
case $1 in
# установите переменные на базе применяемой опции
-u)
TRCASE=upper
ЕХТ=".UС"
OPT=yes
shift
;;
-l)
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.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Завершение процесса с помощью команды KILL
Завершение процесса с помощью команды KILL В SQL Server администратор может удалить процесс, например пользовательское подключение или блокировку базы данных, с помощью команды KILL. Обычно эта команда применяется для чрезвычайного прекращения пользовательского сеанса,
15.4.2.1. Учебный пример: использование make для преобразования файла документации
15.4.2.1. Учебный пример: использование make для преобразования файла документации В make-файле программы fetchmail, например, есть три правила, которые связывают файлы FAQ, FEATURES и NOTES с исходными HTML-файлами fetchmail-FAQ.html, fetchmail-features.html и design-notes.html.HTML-файлы предназначены для просмотра на
15.4.2.1. Учебный пример: использование make для преобразования файла документации
15.4.2.1. Учебный пример: использование make для преобразования файла документации В make-файле программы fetchmail, например, есть три правила, которые связывают файлы FAQ, FEATURES и NOTES с исходными HTML-файлами fetchmail-FAQ.html, fetchmail-features.html и design-notes.html.HTML-файлы предназначены для просмотра на
16.1. С помощью команды exec
16.1. С помощью команды exec Команда exec <filename перенаправляет ввод со stdin на файл. С этого момента весь ввод, вместо stdin (обычно это клавиатура), будет производиться из этого файла. Это дает возможность читать содержимое файла, строку за строкой, и анализировать каждую введенную
5.8. Права доступа и атрибуты файла. Команды chown, chmod и chattr
5.8. Права доступа и атрибуты файла. Команды chown, chmod и chattr 5.8.1. Права доступа к файлам и каталогам Для каждого каталога и файла вы можете задать права доступа. Точнее права доступа автоматически задаются при создании каталога (файла), а вы, при необходимости, можете их
21.4.4. Команды head и tail — вывод начала и хвоста файла
21.4.4. Команды head и tail — вывод начала и хвоста файла Команда head выводит первые десять строк файла, а tail — последние десять. Количество строк может регулироваться с помощью параметра — n.Пример использования: head — n 10 /var/log/messages tail — n 15
3.2.1. Запуск команд и сценариев с помощью команды at
3.2.1. Запуск команд и сценариев с помощью команды at Текст задания можно передать команде at двумя способами: в файле или в режиме командной строки at. Если задание состоит из одной команды или двух — трех команд, объединенных каналом, то удобнее воспользоваться вторым
11.1. Сортировка файлов с помощью команды sort
11.1. Сортировка файлов с помощью команды sort Команда sort позволяет выполнять сортировку входного потока по различным полям (ключам сортировки). Это довольно мощная команда, которая весьма полезна при обработке журнальных файлов или реорганизации текстовых столбцов в
11.3. Объединение файлов с помощью команды join
11.3. Объединение файлов с помощью команды join Команда join выполняет соединение строк из двух текстовых файлов на основании совпадения указанных полей. Ее действие напоминает операцию join языка SQL. Механизм работы команды таков: 1. Каждый из двух входных файлов разбивается
11.4. Вырезание текста с помощью команды cut
11.4. Вырезание текста с помощью команды cut Команда cut позволяет вырезать фрагменты строк из текстовых файлов или из стандартного входного потока. Извлеченный подобным образом текст направляется в стандартный выходной поток. Общий формат команды cut таков:cut [опции]
11.5. Вставка текста с помощью команды paste
11.5. Вставка текста с помощью команды paste С помощью команды cut отдельные символы и целые поля извлекаются из текстовых файлов или стандартного входного потока. Команда paste выполняет противоположное действие: она вставляет в выходной поток содержимое входных файлов. Прежде
20.1.1. Простой способ использования команды shift
20.1.1. Простой способ использования команды shift Для обработки каждого передаваемого аргумента достаточно воспользоваться командой shift. Ниже приводится соответствующий сценарий:$ pg opt2#!/bin/sh# oPt21оор=0while [ $# -ne 0 ] # цикл выполняется до тех пор, пока остаются аргументы doecho $1shift
20.2.5. Использование команды getopts для преобразования файлов
20.2.5. Использование команды getopts для преобразования файлов А теперь воспользуемся сценарием tr_case, который преобразуем с помощью только что изученной команды getopts. Существует единственное отличие между методами getopts и shift, применяемыми для обработки опций командной строки.