¿Puedes pasar varios parámetros a una función bash usando bash -c?

¿Puedes pasar varios parámetros a una función bash usando bash -c?

Estoy usando el bash -ccomando y una función:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

for i in {1..5}
do
bash -c "fun" $i &
done

Mi pregunta es ¿podemos pasar múltiples parámetros para funcionar usando bash -c? Por ejemplo:

fun ()
{
echo "$0"  ## it reads the parameter $i
}

var="string"  #variable

for i in {1..5}
do
bash -c "fun" $i $var &
done

Respuesta1

¿Realmente has ejecutado el código? Ambos fragmentos regresan fun: command not foundy este es el problema que debes abordar primero.

A menos que haya logrado exportar funcomo una función o la haya definidoen otra partede una manera que permita al interior bashreconocer la orden (no daré más detalles). Esta situación sería bastante engañosa y, por tanto, desafortunada en el contexto de futuras cuestiones.

Comencemos con un código sencillo que hace lo que probablemente querías:

#!/bin/bash

fun ()
{
   echo "$1"
}

for i in {1..5}
do
   fun "$i" &
done

Si obtienes números que no están en secuencia, es por &. Lo usé &aquí porque estaba en tu código original.

Su definición de la función es sintácticamente correcta. Mi definición usa $1en lugar de $0, llegaremos a eso. Para usar una función simplemente dice su nombre, con o sin argumentos. En nuestro caso:

fun
fun arg1
fun arg1 arg2

Dentro de una función $1, $2,… expanda a los argumentos respectivos. Usas $@(o $*si sabes lo que estás haciendo) para obtener todos los argumentos. Se utiliza $#para obtener el número de argumentos. Esto es muy similar a una situación en la que funhay un script de shell.

$0dentro de una función es $0del shell principal. No tiene nada que ver con los argumentos pasados ​​a la función.

Puede ejecutar la función en un subshell:

( fun arg1 )

o en segundo plano (que implícitamente también lo ejecuta en un subshell):

fun arg1 &

Si funes una función en el shell principal, estos subshells también sabrán qué hacer cuando el comando sea fun. Por otro lado, un shell que comienza con bash -cno tiene idea de fun.

Nuevamente: a menos que hayas logrado export... o...

En su caso bash -ces más bien un obstáculo. No veo ningún sentido en usarlo. Es posible hacerlo funcionar pero sería engorroso. Aún así, tuexplícitoLa pregunta es:

¿Podemos pasar múltiples parámetros para funcionar usando bash -c?

Podemos. Ejemplo engorroso a continuación. Tenga en cuenta que la función es ligeramente diferente (por motivos educativos). También lo descarté &porque sólo confunde los resultados.

#!/bin/bash

fun ()
{
   echo "$2"
}

export -f fun
var="string"

for i in {1..5}
do
   bash -c 'fun "$2" "$1"' inner-bash "$i" "$var"
done

Es posible exportar una función de Bash a Bash y lo acabamos de hacer. Exportar una función de Bash a otro shell es imposible, a menos que el shell intente ser compatible e interprete deliberadamente algunas variables de entorno como funciones.

fun "$2" "$1"está entre comillas simples, por lo que en el shell principal "$2"y "$1"no se expanden (al estar entre comillas simples,ellos sonnoentre comillas dobles). En el contexto interno, bashestos $2y $1están entre comillas dobles y se expanden a los parámetros proporcionados después inner-bash(que es un nombre arbitrario aquí).

Vea lo que sucede con un número almacenado como $i:

  • está $ien el contexto del shell principal;
  • entonces está $1en el contexto del caparazón interior;
  • entonces está $2en el contexto de la función en el caparazón interno.

No hay ninguna ventaja de usarlo bash -caquí, solo inconvenientes. No compliques tu código de esta manera.

Una cosa más:variables de comillas dobles.

información relacionada