Considere que eu tenho uma matriz muito grande $large_list
, existe uma maneira de escrever uma função que levará a matriz como argumento? Por exemplo:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
Qual é a estratégia usual para fazer algo assim? Eu tentei dar a variável, $large_list
mas estava vazia.
Estou disposto a modificar a função para adaptá-la a qualquer alteração na lista de argumentos.
Para constar, estou usando o ksh88 e estou procurando respostas o mais portáteis possível.
EDIT : Até agora, o melhor que eu poderia fazer é percorrer a matriz e enviar cada elemento como argumento para a função. Isso parece incrivelmente feio e propenso a erros, sem mencionar que é provável que atinja algum limite rapidamente. Aqui está o que eu fiz:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
Não há algo melhor para fazer?
func "${array[@]}"
? Se você só precisa passar um elemento, basta passá-lo - não há necessidade de torná-lo mais complicado passando uma matriz e um índice."${array[$@]}
. Sua sugestão realmente funciona. Mea culpa.Respostas:
Para passar os elementos da matriz como argumentos para a função, use a sintaxe ksh para expandir os elementos da matriz como uma lista.
O
[@]
sufixo faz disso uma expansão de matriz. As aspas duplas protegem cada elemento de maior expansão (divisão e globbing). O resultado da expansão não é, em geral, uma palavra como costuma ser entre aspas duplas, mas tantas palavras quanto elementos na matriz.O N -ésimo elemento da matriz é, em seguida . Para acessá-lo, você precisa usar ; consulte Usar uma referência de variável "dentro" de outra variável
${N}
eval
fonte
myarray=("hello world" wibble)
(2 elementos, o primeiro dos quais contém um espaço):work_on_array "${myarray[@]}"
passa 2 parâmetroshello world
ewibble
;work_on_array ${myarray[@]}
2 passa parâmetroshello
,world
ewibble
. E commyarray=(*)
,work_on_array ${myarray[@]}
passa a lista de arquivos no diretório atual. (Portanto, este é um dos muitos casos em que meus conselhos fazem uma diferença prática.)hello
,world
ewibble
fazer 3 parâmetros.)Existe uma maneira no bash 4.3+, que provavelmente vem do ksh:
Veja também
declare -n
.fonte
Depende do Korn Shell ... As versões recentes da AT&T ksh93 e mksh suportam isso:
No meu shell atual, isso gera "b".
fonte