Luchando durante un tiempo pasando una matriz como argumento, pero de todos modos no funciona. He intentado como a continuación:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Una respuesta con explicación estaría bien.
Editar: Básicamente, eventualmente llamaré a la función desde otro archivo de script. Por favor explique las restricciones si es posible.
copyFiles {…}
ycopyFiles(){…}
ycopyFiles() {…}
, pero nocopyFiles{…}
. Tenga en cuenta el espacio en la variante sin()
También puede pasar la matriz como referencia. es decir:
pero tenga en cuenta que cualquier modificación a arr se realizará en la matriz.
fuente
Si desea pasar uno o más argumentos Y una matriz, propongo que este cambio en el script de @AB
Array sea el último argumento y solo se pueda pasar una matriz
Salida:
fuente
shift
usoshift 6
.arr
. ¿Es posible tener un parámetro de matriz en el medio? ¿O incluso varios parámetros de matrices?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
. Al igual que lo definiría en Python:def copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. No importa, encontré stackoverflow.com/a/4017175/472245Hay un par de problemas Aquí está la forma de trabajo:
Debe haber al menos un espacio entre la declaración de función y
{
No se puede usar
$array
, ya quearray
es una matriz, no una variable. Si desea obtener todos los valores de una matriz, use"${array[@]}"
En su declaración de función principal que necesita,
arr="$@"
ya que"${array[@]}"
se expandirá a los valores indexados separados por espacios, si usa$1
solo obtendría el primer valor. Para obtener todos los valores usearr="$arr[@]}"
.fuente
arr=("$@")
break
continuaciónecho "$i"
. En su versión aún verá todos los elementos. Sin embargo, debe ser de tres líneas.Aquí sigue un ejemplo un poco más grande. Para una explicación, vea los comentarios en el código.
fuente
La mejor manera es pasar como argumentos de posición. Nada más. Puede pasar como cadena, pero de esta manera puede causar algunos problemas. Ejemplo:
o
salida:
Quiere decir que si el valor de la matriz tiene símbolos de espacio, debe citar los elementos antes de pasar para acceder al valor por índice en la función, use los parámetros de posición $ 1 $ 2 $ 3 ... Donde índice 0 -> 1, 1 -> 2, ... Para iterar el acceso, es mejor usar siempre $ 1 y después de Shift. No se necesita nada adicional. Puede pasar argumentos sin una matriz como esta:
bash media crea automáticamente una matriz a partir de argumentos pasados que los pasaron a funcionar y luego tiene argumentos de posición. Además, cuando escribe $ {array [2]}, realmente escribe el argumento consecuente uno dos tres cuatro y los pasa a la función. Entonces esas llamadas son equivalentes.
fuente
Tan feo como es, aquí hay una solución alternativa que funciona siempre que no esté pasando una matriz explícitamente, sino una variable correspondiente a una matriz:
Estoy seguro de que alguien puede llegar a una implementación más limpia de la idea, pero he encontrado que esta es una mejor solución que pasar una matriz como
"{array[@]"}
y luego acceder internamente usandoarray_inside=("$@")
. Esto se vuelve complicado cuando hay otros posicionales /getopts
parámetros. En estos casos, primero tuve que determinar y luego eliminar los parámetros no asociados con la matriz usando alguna combinación deshift
y eliminación de elementos de la matriz.Una perspectiva purista probablemente ve este enfoque como una violación del lenguaje, pero hablando pragmáticamente, este enfoque me ha ahorrado mucho dolor. En un tema relacionado, también uso
eval
para asignar una matriz construida internamente a una variable nombrada de acuerdo con un parámetrotarget_varname
que paso a la función:fuente
array_internally
un alias de la misma:declare -n array_internally=$1
. Y el resto de "se vuelve complicado" y "determinar y luego eliminar ..." se aplica independientemente de cómo se pasa la matriz, por lo que no veo cuál es el punto de eso. Yeval
crear una matriz que potencialmente contenga caracteres especiales está esperando que ocurra el dolor en una fecha posterior.