2

我想创建 256 个做同样事情的函数

基本上我想要一个能够不区分大小写地调用的函数。

示例:我希望applepie()能够不区分大小写地调用:

applepie(){

for B in "$@";
do
another_function_in_my_bash_profile $B
blah blah 
# more stuff ...   
done

}

最直接的方法是用一些大写字母声明另外 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
}

可以将所有参数传递给applepie而不是使用for循环for B in "$@";

4

3 回答 3

6

bash您可以通过定义全小写的函数名称并使用' 陷阱查找缺少的命令名称来伪造不区分大小写的函数名称(需要bash4,您需要在 OS X 上自行安装):

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

因此 ifapple是一个函数,但您尝试将其调用为ApPlE,command_not_found_handle以命令作为参数调用。第一行采用第一个参数 ( ApPlE) 并将其小写。然后它尝试apple使用原始参数运行。

于 2013-10-22T18:04:33.053 回答
0

这是使用纯 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 '[a-z]' '[A-Z]' <<< $funcname) ""
于 2013-10-23T04:46:33.950 回答
0

这是一个相当迟钝的答案,绝对不是单行的,但这里是如何在bc中完成的,在and的帮助下tr(在上工作):

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 '[a-z]' '[A-Z]' <<< ${funcname:$j:1})
    else
        casename=${casename}${funcname:$j:1}
    fi
    done
    alias ${casename}=${funcname}
done

这将执行以下操作;

  • 获取函数名的长度
  • 计算出案例组合的数量(2^n)
  • 循环每个组合
  • 把组合数变成一串二进制数字
  • 摆弄二进制数字字符串,使其与函数名称的长度相同
  • 索引函数名的每个字符和二进制数字字符串,并且仅当相应的二进制数字为 1 时才会更改 toupper() 大小写
  • 将字符重新组合成一个字符串
  • 从每个组合到函数名做一个 bash 别名

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

于 2013-10-22T23:28:15.290 回答