#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
, чтобы убедиться, что прототип для вызываемой функции существует, и выдать сообщение об ошибке, если нет.