Обратите внимание: одиночные кавычки окружают все, что следует за echo -e.
Числовые значения цвета, приведенные ниже, справедливы для rxvt . Для других эмуляторов они могут несколько отличаться.
Таблица 33-1. Числовые значения цвета в escape-последовательностях
Цвет |
Текст |
Фон |
черный |
30 |
40 |
красный |
31 |
41 |
зеленый |
32 |
42 |
желтый |
33 |
43 |
синий |
34 |
44 |
пурпурный |
35 |
45 |
зеленовато-голубой |
36 |
46 |
белый |
37 |
47 |
Пример 33-9. Вывод цветного текста
#!/bin/bash
# color-echo.sh: Вывод цветных сообщений.
black='\E[30;47m'
red='\E[31;47m'
green='\E[32;47m'
yellow='\E[33;47m'
blue='\E[34;47m'
magenta='\E[35;47m'
cyan='\E[36;47m'
white='\E[37;47m'
cecho () # Color-echo.
# Аргумент $1 = текст сообщения
# Аргумент $2 = цвет
{
local default_msg="Нет сообщений."
# Не обязательно должна быть локальной.
message=${1:-$default_msg} # Текст сообщения по-умолчанию.
color=${2:-$black} # Цвет по-умолчанию черный.
echo -e "$color"
echo "$message"
tput sgr0 # Восстановление первоначальных настроек терминала.
return
}
# Попробум что-нибудь вывести.
# ----------------------------------------------------
cecho "Синий текст..." $blue
cecho "Пурпурный текст." $magenta
cecho "Позеленевший от зависти." $green
cecho "Похоже на красный?" $red
cecho "Циан, более известный как цвет морской волны." $cyan
cecho "Цвет не задан (по-умолчанию черный)."
# Аргумент $color отсутствует.
cecho "\"Пустой\" цвет (по-умолчанию черный)." ""
# Передан "пустой" аргумент цвета.
cecho
# Ни сообщение ни цвет не переданы.
cecho "" ""
# Функции переданы "пустые" аргументы $message и $color.
# ----------------------------------------------------
echo
exit 0
# Упражнения:
# ---------
# 1) Добавьте в функцию 'cecho ()' возможность вывода "жирного текста".
# 2) Добавьте возможность управления цветом фона.
Однако, как обычно, в бочке меда есть ложка дегтя. Escape-последовательности ANSI совершенно не переносимы . Вывод в одном эмуляторе терминала (или в консоли) может разительно отличаться от вывода в другом эмуляторе. "Расцвеченные" сценарии, дающие изумительно красивый вывод текста на одном терминале, могут давать совершенно нечитаемый текст на другом. Это ставит под сомнение практическую ценность "расцвечивания" вывода в сценариях, низводя ее до уровня никчемной "игрушки".
Moshe Jacobson разработал утилиту color(http://runslinux.net/projects/color), которая значительно упрощает работу с ANSI escape-последовательностями, заменяя, только что обсуждавшиеся, неуклюжие конструкции, логичным и понятным синтаксисом.
По большей части, сценарии на языке командной оболочки, используются для быстрого решения несложных задач. Поэтому оптимизация сценариев, по скорости исполнения, не является насущной проблемой. Тем не менее, представьте себе ситуацию, когда сценарий, выполняющий довольно важную работу, в принципе справляется со своей задачей, но делает это очень медленно. Написание же аналогичной программы на языке компилирующего типа -- неприемлемо. Самое простое решение -- переписать самые медленные участки кода сценария. Возможно ли применить принципы оптимизации к сценарию на практике?
Для начала проверьте все циклы в сценарии. Основная масса времени уходит на работу в циклах. Если это возможно, вынесите все ресурсоемкие операции за пределы циклов.
Старайтесь использовать встроенные команды. Они исполняются значительно быстрее и, как правило, не запускают подоболочку при вызове.
Избегайте использования избыточных команд, особенно это относится к конвейерам.
cat "$file" | grep "$word"
grep "$word" "$file"
# Эти команды дают один и тот же результат,
#+ но вторая работает быстрее, поскольку запускает на один подпроцесс меньше.
Не следует злоупотреблять командой cat.
Для профилирования сценариев, можно воспользоваться командами time и times. Не следует пренебрегать возможностью переписать особенно критичные участки кода на языке C или даже на ассемблере.
Попробуйте минимизировать количество операций с файлами. Bash не "страдает" излишней эффективностью при работе с файлами, попробуйте применить специализированные средства для работы с файлами в сценариях, такие как awk или Perl.
Записывайте сценарии в структурированной форме, это облегчит их последующую реорганизацию и оптимизацию. Помните, что значительная часть методов оптимизации кода, существующих в языках высокого уровня, вполне применима и к сценариям, однако есть и такие, которые не могут применяться. Основной критерий здесь -- это здравый смысл.
Читать дальше