包含通过通过函数初始化传递的变量插入 perl 字符串的 bash 变量的函数

Cal*_*vin 2 bash perl

greenh='\e[2;30;42m$&\e[0m/g'
yellowh='\e[2;30;43m$&\e[0m/g'
aquah='\e[2;30;46m$&\e[0m/g'

function recolor() { 
perl -pe "s/$1/$2"
}
Run Code Online (Sandbox Code Playgroud)

我用它来重新着色文本

例子:

cat file.txt | recolor WHATEVERWORD $greenh
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将 包含$在函数中,以便我可以像这样使用它

cat file.txt | recolor WHATEVERWORD greenh
Run Code Online (Sandbox Code Playgroud)

我试过

function recolor() { 
perl -pe "s/$1/$$2"
}

function recolor() { 
perl -pe "s/$1/\$$2"
}
Run Code Online (Sandbox Code Playgroud)

他们俩都完全破坏了功能......

rua*_*akh 5

那确实是错误的做法;你把一堆黑客堆在一起,所有这些都“泄漏”到不同的层。(例如,考虑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' ; }
Run Code Online (Sandbox Code Playgroud)

如果您确实想要一个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"
}
Run Code Online (Sandbox Code Playgroud)

(不过,为了完整起见,我应该提到 Bash 确实支持变量间接;如果$2greenh,那么${!2}无论$greenh是什么。但通常最好避免使用该功能,而您的示例正是原因。)