No creo que nadie haya respondido la pregunta. Él no preguntó si podía hacer un eco de cadenas en orden. Más bien, el autor de la pregunta quiere saber si puede simular el comportamiento del puntero de la función.
Hay un par de respuestas que se parecen mucho a lo que haría, y quiero ampliarlo con otro ejemplo.
Del autor:
function x() {
echo "Hello world"
}
function around() {
echo "before"
($1) <------ Only change
echo "after"
}
around x
Para ampliar esto, vamos a tener una función x echo "Hola mundo: $ 1" para mostrar cuando se produce realmente la ejecución de la función. Pasaremos una cadena que es el nombre de la función de "x":
function x() {
echo "Hello world:$1"
}
function around() {
echo "before"
($1 HERE) <------ Only change
echo "after"
}
around x
Para describir esto, la cadena "x" se pasa a la función alrededor de() que ecos "antes", llama a la función x (a través de la variable $ 1, el primer parámetro pasó a su alrededor) pasando el argumento "AQUÍ", finalmente echos después.
Como otro lado, esta es la metodología para usar variables como nombres de funciones. Las variables realmente contienen la cadena que es el nombre de la función y ($ variable arg1 arg2 ...) llama a la función que pasa los argumentos. Ver más abajo:
function x(){
echo $3 $1 $2 <== just rearrange the order of passed params
}
Z="x" # or just Z=x
($Z 10 20 30)
da: 30 10 20, donde se ejecuta la función denominada "X" almacenado en la variable Z y pasan los parámetros 10 20 y 30.
Por encima de donde Referencia de funciones mediante la asignación de nombres de variables a las funciones para que podamos usar la variable en lugar de conocer realmente el nombre de la función (que es similar a lo que podría hacer en una situación de puntero de función muy clásica en c para generalizar el flujo de programa, pero preseleccionando las llamadas de función que realizará basado en argumentos de línea de comando).
En bash, estos no son punteros de función, sino variables que hacen referencia a los nombres de las funciones que utilizará más adelante.
eval es la única manera de hacerlo. – Wes
Puede verificar fácilmente si 'eval $ 1' llamaría a una función usando' if declare -F "$ 1">/dev/null; luego evalúa $ 1; fi' – user123444555621
... o mejor aún: 'eval $ (declarar -F" $ 1 ")' – user123444555621