Передать имя функции в качестве одного из позиционных аргументов в скрипте

#bash

#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. Какова ваша цель этого кода? Ваша bar() функция вообще не имеет смысла. Также ваша foo() функция никогда не вызывается

2. Моя функция bar — это вызываемая функция action_needed , и foo это любое действие, которое действительно что-то выполняет. foo аргументы — это то, на что foo воздействует. Может потребоваться много действий, но все они имеют одинаковое предупреждающее сообщение.

Ответ №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" >amp;2; return 1 ; }

    "$function" "$@"
}

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

bar foo "${foo_args[@]}"
  

Также безопасно проверить с помощью type -t , чтобы убедиться, что прототип для вызываемой функции существует, и выдать сообщение об ошибке, если нет.