Lutando por um tempo passando uma matriz como argumento, mas não está funcionando de qualquer maneira. Eu tentei como abaixo:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Uma resposta com explicação seria legal.
Edit: Basicamente, acabarei chamando a função de outro arquivo de script. Por favor, explique as restrições, se possível.
copyFiles {…}
ecopyFiles(){…}
ecopyFiles() {…}
, mas nãocopyFiles{…}
. Observe o espaço na variante sem()
Você também pode passar a matriz como referência. ou seja:
mas observe que quaisquer modificações no arr serão feitas no array.
fonte
Se você deseja passar um ou mais argumentos E uma matriz, proponho que essa alteração no script da @AB
Matriz seja o último argumento e apenas uma matriz possa ser transmitida.
Resultado:
fonte
shift
uso.shift 6
.arr
. É possível ter um parâmetro de matriz no meio? Ou mesmo vários parâmetros de matrizes?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
. Como eu definiria-lo em python:def copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. Não importa, eu encontrei stackoverflow.com/a/4017175/472245Existem alguns problemas. Aqui está a forma de trabalho:
Deve haver pelo menos um espaço entre a declaração da função e
{
Você não pode usar
$array
, comoarray
é uma matriz, não uma variável. Se você deseja obter todos os valores de uma matriz, use"${array[@]}"
Em você principal declaração da função que você precisa
arr="$@"
como"${array[@]}"
vai se expandir para os valores indexados separados por espaços, se você usar$1
você obteria apenas o primeiro valor. Para obter todos os valores, usearr="$arr[@]}"
.fonte
arr=("$@")
break
abaixoecho "$i"
. Na sua versão, você ainda verá todos os elementos. No entanto, deve haver três linhas.Aqui segue um exemplo um pouco maior. Para explicação, consulte os comentários no código.
fonte
A melhor maneira é passar como argumentos de posição. Nada mais. Você pode passar como string, mas dessa maneira pode causar alguns problemas. Exemplo:
ou
resultado:
Você quer dizer que se o valor da matriz possui símbolos de espaço, você deve citar os elementos antes de passar para acessar o valor pelo índice na função, usar parâmetros de posição $ 1 $ 2 $ 3 .... Onde o índice 0 -> 1, 1 -> 2, ... Para iterar o acesso, é melhor usar sempre $ 1 e depois do Shift. Nada adicional é necessário. Você pode passar argumentos sem nenhuma matriz como esta:
bash media cria automaticamente uma matriz a partir de argumentos passados que os passaram a funcionar e, em seguida, você tem argumentos de posição. Além disso, quando você escreve $ {array [2]}, realmente escreve o argumento consequente um dois três quatro e os passa para a função. Portanto, essas chamadas são equivalentes.
fonte
Por mais feia que seja, aqui está uma solução alternativa que funciona desde que você não esteja passando uma matriz explicitamente, mas uma variável correspondente a uma matriz:
Tenho certeza de que alguém pode sugerir uma implementação mais limpa da ideia, mas achei que essa é uma solução melhor do que passar uma matriz
"{array[@]"}
e acessá-la internamente usandoarray_inside=("$@")
. Isso se torna complicado quando existem outrosgetopts
parâmetros / posicionais . Nesses casos, tive que primeiro determinar e remover os parâmetros não associados à matriz usando alguma combinação deshift
remoção e elemento da matriz.Uma perspectiva purista provavelmente vê essa abordagem como uma violação da linguagem, mas falando pragmaticamente, essa abordagem me salvou de muita tristeza. Em um tópico relacionado, eu também uso
eval
para atribuir uma matriz construída internamente a uma variável nomeada de acordo com um parâmetro quetarget_varname
eu passo para a função:fonte
array_internally
um apelido para ele:declare -n array_internally=$1
. E o resto sobre "se torna complicado" e "determina e remove ..." se aplica independentemente de como você passa a matriz, então não vejo qual é o sentido disso. Eeval
uma matriz potencialmente contendo caracteres especiais está apenas aguardando o luto acontecer mais tarde.