将函数名称作为脚本中的位置参数之一传递

时间:2019-03-14 04:50:39

标签: bash

我想创建一个bash函数bar,该函数以函数foo作为参数,但是让foo也具有参数。

function foo() {
    foo_args=("$@")
    for i in "${foo_args[@]}";
        do
            echo "$i"
        done
}

function bar() {
        ($1) 
}

foo_args=(
        "one" "two" "three"
)

bar foo foo_args

如何将foo_args传递给bar

编辑:

我尝试过:

bar foo "${foo_args[@]}"

使用:

function bar() {
        params="${3}"
        ($1 ${params[@]}) 
}

但是foo只看第一个元素。

1 个答案:

答案 0 :(得分:1)

不是十分确定您打算使用foo()bar()函数做什么,但是在函数bar中您没有收到整个位置参数,但仅$1,请改用$@。假设您需要将参数从bar()传递到foo(),我已经修改了代码以满足您的要求。由于您的第一个参数包含函数名称,请在$1中获取它,然后使用shift删除$1并将其余的参数保留在$@

还从函数定义中删除非标准function关键字。不用说是完全可以的

#!/usr/bin/env bash

foo() {
    foo_args=("$@")
    for arg in "${foo_args[@]}"; do
        echo "$arg"
    done
}

bar() {
    function=$1; shift

    [ "$(type -t "$function")" = function ] || 
        { echo "$function prototype is not available" >&2; return 1 ; }

    "$function" "$@"
}

foo_args=(
    "one" "two" "three"
)

bar foo "${foo_args[@]}"

同样可以安全地使用type -t进行检查,以确保所调用函数的原型存在,如果不存在则抛出错误消息。