Это действительно неправильный подход; Вы собираете кучу хаков, которые «просачиваются» в разные слои. (Например, рассмотрим recolor 'x//g;#' greenh
, который предназначен для принятия вхождений x//g;#
и окрашивания их в зеленый цвет, но который фактически принимает вхождения x
и удаляет их; или recolor foo blueh
, который предназначен для вхождения foo
и закрасьте их синим, но на самом деле это не работает, потому что ваша функция тайно зависит от устанавливаемой глобальной переменной, а пользователь не определил $blueh
.)
Я думаю, вам лучше просто определяя отдельные функции:
greenh() { pat="$1" perl -pe 's/$ENV{pat}/\e[2;30;42m$&\e[0m/g' ; }
yellowh() { pat="$1" perl -pe 's/$ENV{pat}/\e[2;30;43m$&\e[0m/g' ; }
aquah() { pat="$1" perl -pe 's/$ENV{pat}/\e[2;30;46m$&\e[0m/g' ; }
Если вы действительно хотите одну recolor
функцию, то вам лучше определить цвета внутри нее:
recolor() {
perl -e '
my $prefix =
{
"greenh" => "\e[2;30;42m",
"yellowh" => "\e[2;30;43m",
"aquah" => "\e[2;30;46m",
}->{$color};
die "Unrecognized color $color" unless $prefix;
while (<>) {
s/$pat/$prefix$&\e[0m/g;
print;
}
' -s -- -pat="$1" -color="$2"
}
(для полноты ' ради, однако, я должен упомянуть, что Bash поддерживает переменную косвенность, если $2
равен greenh
, то ${!2}
равен $greenh
, но эту функцию обычно лучше избегать, и ваш пример именно поэтому .)