142
Часть II • Защитные операции
с использованием bash
((scaled == 0)) && scaled=1 # гарантированный
минимальный размер
for((i=0; i
printf '\n'
} # pr_bar
maxbar=60 # наибольшее количество
символов в строке
MAX=60
while
read dayst timst qty
do
if (( qty > MAX ))
then
let MAX=$qty+$qty/4 #
предоставляем немного места
echo " **** rescaling: MAX=$MAX"
fi
printf '%6.6s %6.6s %4d:' $dayst $timst $qty
pr_bar $qty $MAX
done
.Функция.
pr_bar
.выводит.строку.хештегов,.масштабированных.на.основе.предо-
ставленных.параметров.до.максимального.размера..Эта.функция.может.показаться.
знакомой,.так.как.мы.ранее.уже.использовали.ее.в.сценарии.
histogram.sh
.
.Это.самый.длинный.размер.строки.хештега,.который.мы.можем.допустить.(что-
бы.обойтись.без.переноса.строки).
.Насколько.большими.будут.значения,.которые.необходимо.отобразить?.Не.зная.
этого.заранее.(хотя.эти.данные.могут.быть.предоставлены.сценарию.в.качестве.аргу-
мента),.сценарий.будет.отслеживать.максимум..Если.этот.максимум.будет.превышен,.
значение.начнет.«масштабироваться».и.линии,.которые.выводятся.сейчас,.и.будущие.
линии.также.будут.масштабированы.до.нового.максимума..Сценарий.добавляет.25.%.
к.максимальному.значению,.так.что.ему.не.придется.масштабировать.значение,.если.
очередное.новое.значение.каждый.раз.увеличивается.только.на.1–2.%.
.
printf
.определяет.минимальную.и.максимальную.ширину.первых.двух.полей,.
которые.будут.выведены..Это.метки.даты.и.времени,.которые.при.превышении.
значений.ширины.будут.обрезаны..Чтобы.вывести.значение.целиком,.указываем.
его.ширину.размером.четыре.символа..При.этом,.несмотря.на.ограничения,.будут.
напечатаны.все.значения..Если.количество.символов.в.значениях.будет.меньше.
четырех,.недостающие.будут.дополнены.пробелами.
Поскольку.данный.сценарий.считывается.из.stdin,.вы.можете.запустить.его.само-
стоятельно,.чтобы.увидеть,.как.он.себя.поведет..Вот.пример:
$ bash livebar.sh
201010 1020 20
201010 1020 20:####################