Estou tentando escrever uma função que grava arrays com um nome que é passado. Dada a seguinte função bash:
function writeToArray {
local name="$1"
echo "$name"
declare -a "$name"
${name[0]}="does this work?"
}
Correndo assim:
writeToArray $("test")
Eu recebo dois erros:
bash: declare: `': not a valid identifier
=does this work?: command not found
Espero ser capaz de fazer isso:
writeToArray $("test")
for item in "${test[@]}"; do
echo "item"
echo "$item"
done
Isso deve imprimir:
item
does this work?
Como eu poderia configurar isso corretamente para escrever a matriz (nomeada test
no exemplo, de forma que essa matriz nomeada test
seja legível fora da função)?
Você usaria um nameref para isso:
Teste:
Com versões mais antigas
bash
que ainda não tinham namerefs, você poderia usareval
:Quando
writeToArray
é invocadotest
como argumento,eval
é passadotest[0]='does this work?'
como argumento e, por sua vez, éeval
uado como código na linguagem shell onde atribuidoes this work?
ao elemento de índice 0 dotest
array (também funciona para array associativo; variáveis escalares são convertidas em arrays) .Observe que
$("test")
é a sintaxe para capturar e expandir a saída dotest
comando e dividi-lo + glob quando estiver no contexto da lista.test
(também conhecido como[
) não produz saída quando nenhum argumento é passado), então$("test")
expande para a string vazia e split+glob não fornece nada a você.Aqui, é o nome da sua variável que você deseja passar para
writeToArray
, portantotest
, não seu conteúdo ("$test"
) nem a saída de um comando com o mesmo nome ("$(test)"
) e muito menos a saída de um comando com o mesmo nome sujeito a split+glob como na sua$("test")
tentativa.