Понадобилось мне рисовать рамочку вокруг выводимого из скрипта сообщения.
Нарисовать ее вокруг заготовленного текста не проблема. Но как быть, если текст меняется и его длина заранее неизвестна, то есть, нельзя заранее нарисовать рамочку нужной длины. Рисовать с запасом - не вариант, душа просит красоты.
Отсюда переходим к другой задаче: как повторить символ или набор символов N-ое число раз, чтобы динамически менять ширину рамочки.
Элегантное решение нашлось в комментариях здесь:
head -c 80 < /dev/zero | tr '\0' '.'
То есть, загружаем нужное количество символов с кодом 0x00 из псевдоустройства /dev/zero, а потом в полученном "тексте" меняем каждый такой символ на нужный нам.
Там же предложено и несколько других вариантов, но на мой взгляд этот лучший. По крайней мере, для моих целей. В скрипте обрабатывается переадресация почты и если переадресация для выбранного пользователя уже настроена, то надо предупредить об этом. Настроенный адрес пересылки находится в переменной SENDING_TO
ALRDY='| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА '$SENDING_TO' |'
ALRDY_LINE='+'`head -c $(( ${#ALRDY}-2 )) </dev/zero|tr '\0' '-'`'+'
echo $ALRDY_LINE
echo $ALRDY
echo $ALRDY_LINE
В переменную ALRDY помещаем шаблонную строку - фиксированный текст и место для вставки переменной. По краям стоят символы "вертикальная черта", они образуют боковые стороны рамки. А в переменную ALRDY_LINE поместим нужное количество дефисов, размещенных между двумя плюсиками - "углами" рамки. Т.к. верхняя и нижняя стороны рамки одинаковы, то используем только одну переменную, но ничто не мешает использовать их две или больше, в зависимости от.
Веселье начинаем в следующей строке. В начале и в конце добавляем знак "+" к ALRDY_LINE, а между ними результат слегка переработанной команды из примера в начале поста.
${#ALRDY} возвращает длину переменной в СИМВОЛАХ (не в байтах! поэтому юникод работает нормально)
$(( ... )) - это арифметика, из полученной длины переменной ALRDY вычитаем 2, то есть, не принимаем в расчет начальную и конечную вертикальные черточки, поскольку над ними будут не дефисы, а два добавленных вручную плюса.
Результат этого выражения используем как параметр для ключа -c команды head, и вся комбинация обозначает "получить из /dev/zero символы в количестве "длина переменной ALRDY минус два" и заменить каждый из них на дефис". Так как к ALRDY_LINE пририсовываем еще два плюсика, то длины ALRDY и ALRDY_LINE становятся равными.
И вот примерно что получается:
+-----------------------------------------------------+
| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА bobylova_mv@jcx.srkz.ru |
+-----------------------------------------------------+
+---------------------------------------------+
| !!! УЖЕ ПЕРЕСЫЛАЕТ ПОЧТУ НА kmv@khv.cpsu.su |
+---------------------------------------------+
Просто и очень текстово :-)
В принципе, эту идею можно использовать и для генерации таблиц, а не только рамочек, но у меня в этом необходимости нет.
Комментариев нет:
Отправить комментарий
Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.