Использование команды getopts 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование команды getopts



 

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

getopts option-string variable [arg... ]

Флаги – это опции командной строки, обычно помеченные знаком минус; Например, -F является флагом для команды ls -F. Иногда эти флаги имеют аргументы, связанные с ними. Программы интерпретируют эти флаги, соответствующим образом изменяя свое поведение.

Строка опций option-string – это список возможных букв и чисел соответствующего флага. Если ожидается, что некоторый флаг будет сопровождаться некоторым аргументом, то за этой буквой должно следовать двоеточие. Соответствующей переменной присваивается буква данной опции. Если команда getopts может распознать аргумент, она возвращает истину. Принято включать getopts в цикл while и анализировать введенные данные с помощью оператора case.

Предположим, необходимо распознать командную строку следующего формата: testprog -ifile_in.txt -ofile_out.doc -L -t -r. Вот как выглядит использование оператора getopts в этом случае:

while getopts o:i:Ltr optletter
do case $optletter in
o) oflag=1; oval=$OPTARG;;
i) iflag=1;ival=$OPTARG;;
L) Lflag=1;;
t) tflag=1;;
r) rflag=1;;
*) echo Illegal option $optletter
esac
done

Функция getopts включает две специальные переменные среды–OPTARG и OPTIND. Если ожидается дополнительное значение, то OPTARG устанавливается в значение этого аргумента (будет равна file_in.txt для опции ifile_out.doc для опции o). OPTIND является числовым индексом на упомянутый аргумент. Функция getopts также понимает переменные типа массив, следовательно, можно использовать ее в функции не только для синтаксического анализа аргументов функций, но и для анализа введенных пользователем данных.

 

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

 

Часто бывает необходимо обеспечить проведение каких-либо действий циклически и управление дальнейшими действиями в зависимости от результатов проверки некоторого условия. Для решения подобных задач язык программирования bash предоставляет Вам возможность использовать такие управляющие конструкции, как for, case, if и while. С точки зрения командного процессора эти управляющие конструкции являются обычными командами и могут использоваться как при создании командных файлов, так и при работе в интерактивном режиме. Команды, реализующие подобные конструкции, по сути дела являются операторами языка программирования bash. Поэтому при описании языка программирования bash термин "оператор" будет использоваться наравне с термином "команда".

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

test -f file

возвращает нулевой код завершения ("истина"), если файл file существует, и ненулевой код завершения ("ложь") в противном случае.

test s – истина, если аргумент s имеет значение "истина";

test -f file – истина, если файл file существует;

test -i file – истина, если файл file доступен по чтению;

test -w file – истина, если файл file доступен по записи;

test -e file – истина, если файл file - исполняемая программа;

test -d file – истина, если файл file является каталогом.

 

Оператор цикла for

 

В обобщенной форме оператор цикла for выглядит следующим образом:

for имя [in список-значений]
do список-команд
done

При каждом следующем выполнении оператора цикла for переменная "имя" принимает следующее значение из списка значений, задаваемых списком "список-значений". Вообще говоря, "список-значений" является необязательным. При его отсутствии оператор цикла for выполняется для всех позиционных параметров или, иначе говоря, аргументов. Таким образом, оператор for i эквивалентен оператору for i in $*. Выполнение оператора цикла for завершается, когда "список-значений" будет исчерпан. Последовательность команд (операторов), задаваемая списком "список-команд", состоит из одной или более команд оболочки, отделенных друг от друга с помощью символов newline или;. Рассмотрим примеры использования оператора цикла for. В результате выполнения оператора

for A in alpha beta gamma
do echo A
done

на терминал будет выведено следующее:

alpha
beta
gamma

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

for i
do grep $i *.c
done

Поместив эту последовательность команд в файл findref, Вы сможете затем, используя команду

findref'hash(''insert(''symbol('

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

 

Оператор выбора case

 

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

case имя in
шаблон1) список-команд;;
шаблон2) список-команд;;
...
esac

Выполнение оператора выбора case сводится к тому, что выполняется последовательность команд (операторов), задаваемая списком "список-команд", в строке, для которой значение переменной "имя" совпадает с "шаблоном". Поскольку метасимвол * соответствует произвольной, в том числе и пустой, последовательности символов, то его можно использовать в качестве "шаблона" в последней строке перед служебным словом esac. В этом случае реализуются все действия, которые необходимо произвести, если значение переменной "имя" не совпадает ни с одним из шаблонов, заданных в предшествующих строках.

Рассмотрим примеры использования оператора выбора case. В результате выполнения оператора

for A in alpha beta gamma
do case $A in
alpha) B=a;;
beta) В=с;;
gamma) В=e
esac
echo $B
done

на терминал будет выведено следующее:

a
c
e

 

Условный оператор if

 

В обобщенной форме условный оператор if выглядит следующим образом:

if список-команд
then список-команд
{elif список-команд
then список-команд}
[else список-команд]
fi

Выполнение условного оператора if сводится к тому, что сначала выполняется последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово if. Затем, если последняя выполненная команда из этой последовательности команд возвращает нулевой код завершения ("истина"), будет выполнена последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово then. Фраза elif проверяется в том случае, когда предыдущая проверка была ложной. Строка, содержащая служебное слово else, является необязательной. Если она присутствует, то последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово else, будет выполнена только при условии, что последняя выполненная команда из последовательности команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово if или elif, возвращает ненулевой код завершения ("ложь"). Рассмотрим следующий пример:

for A in *
do if test -d $A
then echo $A: is a directory
else echo -n $A: is a file and
if test -w $A
then echo writeable
elif test -r $A
then echo readable
else echo neither readable nor writeable
fi
fi
done

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

Оставшиеся строки выполняются только в том случае, если проверка того, является ли файл, имя которого представляет собой текущее значение переменной А, каталогом, дает отрицательный ответ. Это означает, что файл, имя которого представляет собой текущее значение переменной А, является обычным файлом. Если этот файл является обычным файлом, то на стандартный вывод выводятся имя этого файла и сообщение о том, что файл с указанным именем является обычным файлом. Эти действия в приведенном выше примере обеспечиваются в результате выполнения четвертой строки. Особенностью использования команды echo в этой строке является использование флага -n, благодаря чему выводимая командой echo строка не будет дополнена символом newline (перевод строки), что позволяет впоследствии дополнить эту строку, как это, например, показано в приведенном выше примере. Вторая, содержащая служебное слово if, строка проверяет, доступен ли по записи файл, имя которого представляет собой текущее значение переменной А. Если этот файл доступен по записи, то строка дополняется соответствующим сообщением. Если же этот файл недоступен по записи, то проверяется, доступен ли этот файл по чтению. Эти действия в приведенном выше примере обеспечиваются в результате выполнения седьмой строки. Если этот файл доступен по чтению, то строка дополняется соответствующим сообщением. Если же этот файл недоступен ни по записи, ни по чтению, то строка также дополняется соответствующим сообщением. Эти действия в приведенном выше примере обеспечиваются в результате выполнения девятой строки.

 



Поделиться:


Последнее изменение этой страницы: 2021-01-14; просмотров: 119; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.158.47 (0.008 с.)