如何将 bash 函数的名称定义为正则表达式

如何将 bash 函数的名称定义为正则表达式

我四处搜寻,找不到答案。

我想定义一个这样的函数

function \d{2} () {
    echo $1_or_smth
}

然后如果我在我的终端说

12

我希望它回显 12。

答案1

以下方法适用于 zsh:

preexec() {
  if [[ $1 = <-> ]]; then
    $1() {
      echo $0
      unfunction $0
    }                                                            
  fi
}

正如您的问题的评论中所指出的,您不能拥有带有变量名称的函数。它的作用是preexec在命令失败之前使用钩子拦截命令并创建临时函数。我使用它的一个变体,即 nmh 邮件程序,用于按编号显示电子邮件消息。

答案2

通过 bash,您可以使用该command_not_found_handle函数。

小心一点A)一些发行版已经使用它来提供他们的“安装富巴如果你想使用命令”功能,以及b)它不会像 shell 函数那样覆盖外部命令。

另请注意,\dbash 使用的正则表达式方言不支持该=~操作符(顺便说一句,这是 bash 中正则表达式的唯一使用)。

2digits(){
    echo "$1_or_smth"
}
command_not_found_handle(){
    if [[ $1 =~ ^[0-9]{2}$ ]]; then 2digits "$@"
    else printf >&2 '%s: command not found\n' "$1"; return 127 
    fi
}

然后

$ 33
33_or_smth
$ 444
444: command not found

同样的事情在 zsh 中也可以使用该command_not_found_handler函数(注意名称差异——zsh 中有一个额外的“r”)。

preexec虽然您可以使用 bash 中的陷阱来模拟 zsh DEBUG,但您将无法从其他答案中实现这一技巧,因为 bash 不允许函数名称仅包含数字。

相关内容