首页 > 解决方案 > 无法在bash中调用函数作为参数

问题描述

团队,

在调用包含该函数的脚本时,我无法将函数作为参数调用。你能暗示我错过了什么吗?

#!/bin/bash
if declare -f "$1" > /dev/null
then
  "$@"
else
  echo "$1 is not a defined function" >&2
  exit 1
fi

gfc() {
TEST_PERF_CLASS="GFC"
K8S_Node_Name=("10.1" "10.2" "10.3")
#declare -a K8S_Node_Name=("10.1" "10.2" "10.3")
if ([ "$TEST_PERF_CLASS" = "DFC" ] || [ "$TEST_PERF_CLASS" = "GFC" ]) && [ "$K8S_Node_Name" != "ALLCORDONED" ]; then
    for node in "${K8S_Node_Name[@]}"; do
      echo "$node"
      done
elif ([ "$TEST_PERF_CLASS" = "DFC" ] || [ "$TEST_PERF_CLASS" = "GFC" ]) && [ "$K8S_Node_Name" = "ALLCORDONED" ]; then
  echo "CORDONED"
else
    printf "Invalid NODE\n"
fi
}

dfc() {
TEST_PERF_CLASS="DFC"
K8S_Node_Name=("11.1" "110.2" "110.3")
if ([ "$TEST_PERF_CLASS" = "DFC" ] || [ "$TEST_PERF_CLASS" = "GFC" ]) && [ "$K8S_Node_Name" != "ALLCORDONED" ]; then
    for node in "${K8S_Node_Name[@]}"; do
      echo "$node"
      done
elif ([ "$TEST_PERF_CLASS" = "DFC" ] || [ "$TEST_PERF_CLASS" = "GFC" ]) && [ "$K8S_Node_Name" = "ALLCORDONED" ]; then
  echo "CORDONED"
else
    printf "Invalid NODE\n"
fi
> bash bash-call-function.sh gfc

预期输出:

10.1
10.2
10.3

实际的:

gfc is not a defined function

标签: bash

解决方案


考虑这个脚本:

#!/usr/bin/env bash

echo "before declaration:"
type myfunc

myfunc() { echo "foo"; }

echo "after declaration:"
type myfunc

它打印以下内容:

before declaration:
./functest: line 4: type: myfunc: not found
after declaration:
myfunc is a function
myfunc () 
{ 
    echo "foo"
}

你不能在声明之前调用一个函数;您所要做的就是将您的函数声明移动到文件的顶部。


推荐阅读