
Семинар №3
Подготовка к лабораторной работе №2
Разработать программу выбора записи максимального двоичного числа в заданном наборе произвольных аргументов командной строки её вызова. При этом аргументы, которые не являются натуральными двоичными числами, не учитываются, а двоичные записи задают любые из нулей и единиц. Порядковый номер искомого наибольшего двоичного числа в заданном наборе аргументов программы должен идентифицировать её целочисленный код возврата. Когда среди аргументов отсутствует записи двоичных чисел, программа должна возвращать нулевое значение.
Команда test
Используется для :
1. Проверки прав доступа и файлу.
2. Тестирования строк.
3. Тестирования численных данных.
-z строка ( test примет значение истины, если строка имеет нулевую длину)
-n строка (test истинно, если ненулевая длина)
str1 = str2
str1 != str2
str1 \< str2 ( меньше лексиграфически, например abc < def)
str1 \> str2
0 - истина
1 - ложь
i1 -eq i2 сравнение на равенство
i1 -ne i2 сравнение на неравенство
i1 -lt i2 меньше строго
i1 -le i2 меньше нестрого
i1 -qt i2 больше строго
i1 -qe i2 больше нестрого
Логические выражения :
!выражение1 истинно, когда ложно
выр1 -a выр2 истинно, когда AND
выр1 -o выр2 истинно, когда OR
; - следующая команда на той же строке
Пример :
$[ $st1 != $st2 ]
$echo $? # вывод результата последней команды
\ - применяется во время присвоения
С помощью expr можно осуществлять поиск по шаблону. Для этого нужно использовать оператор сопоставления, который является регулярным выражением. Обычно возвращается число совпадений.
Пример :
$value = string1
$expr $value : '.*'
Также можно использовать для поиска подстроки.
Пример:
$value = file.txt
$expr $value : ' \(.*\).txt '
Результат : File
$expr length str1 # длина строки
$expr index abcdef gd # выводит порядковый номер любого первого # встретившегося элемента из второй строки в первой
Результат : 4
$expr substr "abcd efg hi" 2 5
pos length
Результат : bcd e
Пример программы :
$bash snn.bash binarray1 011 10 ; echo $?
#!/bin/bash
count=0
maxi=0
numi=0
for i in $* ; do
let count++ # count= `expr $count + 1` (альтернатива)
pref = `expr "$i" : '.*[^01] ' ` # возвращает число позиций до первого ненуля и неединицы
if test $pref -qt 0
then continue
fi
bin = `expr $i : ' 0*\(1[01]*\) ' ` # отброс нулей
bin = ${bin:=0} # если bin пуст, то ему присваивается ноль
if [ $bin \< $maxi ]
then continue
fi
maxi = $bin
numi = $count
done
if test $numi -qt 0
then echo $maxi
fi
exit $numi # возвращаемое значение