Bash函数数组

10
我正在尝试创建一个函数数组,以便按顺序迭代每个函数。
declare -a FUNCTION
FUNCTION[1]="FUNCTION.A"
FUNCTION[2]="FUNCTION.B"
FUNCTION[3]="FUNCTION.C"

for i in "${!FUNCTION[@]}"; do
  ${FUNCTION[$i]};
done

这只是打印出 FUNCTION.A 并显示“未找到命令”。我需要它运行该函数。有什么建议吗?


2
这是因为您没有定义函数 FUNCTION.A 本身。 :) - Olleg
6个回答

17

对我来说工作得很好。

declare -a FUNCTION
FUNCTION[1]="FUNCTION.A"
FUNCTION[2]="FUNCTION.B"
FUNCTION[3]="FUNCTION.C"

#Define one of the functions
FUNCTION.A() { echo "Inside of FUNCTION.A"; }


$ for i in "${!FUNCTION[@]}"; do   ${FUNCTION[$i]}; done

输出:

Inside of FUNCTION.A
FUNCTION.B: command not found
FUNCTION.C: command not found

4
我认为另一种方式看起来更好。
funcs_to_test=( voltage_force_landing voltage_warn_critical )

for testP in "${funcs_to_test[@]}"
do  
    $testP
done

请确保在调用此代码之前编写了您的函数。

不幸的是,这并不总是调用相应的函数,它只打印函数名。要调用函数,您应该编写${funcs_to_test[testP]}而不是$testP。 - RigaCrypto

3

我们可以通过使用数组中的名称来定义函数,并在定义之后调用这些函数:after(在定义函数之后)。

#!/bin/sh

declare -a functions=( a b c )
for f in ${functions[@]}; do
    eval "$f() { 
              echo "Hello from $f" 
              # ...
          }"
    $f
done

或者:

#!/bin/sh

declare -a functions=( a b c )

a() { echo "Hello from $FUNCNAME"; }
b() { echo "Hello from $FUNCNAME"; }
c() { echo "Hello from $FUNCNAME"; }

for f in ${functions[@]}; do 
    $f
done 

1

我是一个白痴……显然,这个函数必须在它被调用的地方上面。有点烦人。我希望所有的函数都能放在底部。


1
你也可以这样声明函数:

FUNCTION=(FUNCTION.A FUNCTION.B FUNCTION.C)

然后像这样迭代它:
for i in "${!FUNCTION[@]}"; do
${FUNCTION[i]}

这应该有效。如果你只调用"$i",它只会打印出来数组中函数的名称。


0
为了避免这个小麻烦,只需将脚本的主体放入另一个函数中即可。(我通常称其为“app_main”,因为在bash中,“main”是脚本函数的名称。)
#!/usr/bin/env bash # more portable

first() { echo "${FUNCNAME[0]}: $@" ; }
second() { echo "${FUNCNAME[0]}: $@" ; }

app_main() { 
    first "hello"
    second "goodbye" 17 3.14159
}

app_main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接