创build256个function,做同样的事情 – 创build一个不区分大小写的函数 – 一个class轮将所有parameter passing给一个函数?

我想创build256个function,做同样的事情

基本上我想要一个能够被称为不区分大小写的函数

例如:我想让applepie()能够不区分大小写:

 applepie(){ for B in "$@"; do another_function_in_my_bash_profile $B blah blah # more stuff ... done } 

最直接的方法是用caps中的一些字母来声明另外的255个函数:

 Applepie(){ for B in "$@"; do another_function_in_my_bash_profile $B blah blah # more stuff ... done } 

 aPplepie(){ for B in "$@"; do another_function_in_my_bash_profile $B blah blah # more stuff ... done } 

一路去

 APPLEPIE(){ for B in "$@"; do another_function_in_my_bash_profile $B blah blah # more stuff ... done } 

总共有256个(2的8次幂)

是否有可能迅速做到这一点? 还是有更像“内置”的方法?

 case-insensitive appelepie(){ for B in "$@"; do another_function_in_my_bash_profile $B blah blah # more stuff ... done } 

或者是否有可能这样做

 case-insensitive APPLEPIE(){ command -pass_all_parameters applepie } 

可以将所有parameter passing给applepie,而不是for B in "$@";中使用for循环for B in "$@";

你可以通过定义所有小写函数名和使用bash的陷阱缺少命令名(需要bash 4,你需要在OS X上自行安装)来伪造一个不区分大小写的函数名:

 command_not_found_handle () { cmd_name=${1,,} shift $cmd_name "$@" } 

因此,如果apple是一个函数,但是您尝试将其称为ApPlE ,那么command_not_found_handle将以该命令作为参数进行调用。 第一行取第一个参数( ApPlE ),小写。 然后它试图用原始的参数运行apple

这是一个非常愚蠢的答案,绝对不是一蹴而就的,但是这里是如何在bash中完成的,在bctr帮助下(在osx上工作 ):

 funcname="applepie" strlen=${#funcname} numcombos=$((2 ** strlen)) for ((i=1; i<numcombos; i++)); do binstr=$(echo "obase=2; $i" | bc ) zlen=$((1+strlen-${#binstr})) binstr=$(printf "%0${zlen}x" 0)${binstr} binstr=${binstr:1:$strlen} casename="" for ((j=0; j<strlen; j++)); do if [ ${binstr:$j:1} = 1 ]; then casename=${casename}$(tr '[az]' '[AZ]' <<< ${funcname:$j:1}) else casename=${casename}${funcname:$j:1} fi done alias ${casename}=${funcname} done 

这做以下;

  • 获取函数名称的长度
  • 计算出病例组合的数量(2 ^ n)
  • 在每个组合上循环
  • 将组合号码变成一串二进制数字
  • 摆弄二进制数字的字符串,使其与函数名称的长度相同
  • 通过函数名和二进制数字串的每个字符索引,并且只有当相应的二进制数字是1时,toupper()情况才改变
  • 重新组合字符串
  • 从每个组合的bash别名到函数名称

假定该函数已定义,并具有全小写的名称。

这是使用纯bash的另一种方法 – 递归函数。 当我看到递归函数时,我通常会跑一英里,但是在这种情况下,它运行得非常好:

 funcname="applepie" function cr { if [ "$1" ]; then cr "${1:1:${#1}}" "${2:1:${#2}}" "${3}${1:0:1}" cr "${1:1:${#1}}" "${2:1:${#2}}" "${3}${2:0:1}" else alias $3=$funcname fi } cr $funcname $(tr '[az]' '[AZ]' <<< $funcname) ""