Como usar pseudo-matrizes no script de shell POSIX?
Eu quero substituir uma matriz de 10 inteiros em um script Bash por algo semelhante no script de shell POSIX.
Consegui encontrar os truques sh (shell POSIX) de Rich , na seção Trabalhando com arrays .
O que eu tentei:
save_pseudo_array()
{
for i do
printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"
done
echo " "
}
coords=$(save_pseudo_array "$@")
set -- 1895 955 1104 691 1131 660 1145 570 1199 381
eval "set -- $coords"
Não entendo, esse é o problema, se alguém puder dar uma luz, agradeço muito.
A ideia básica é usar
set
para recriar a experiência de trabalhar com valores indexados de uma matriz. Portanto, quando você quiser trabalhar com uma matriz, executeset
com os valores; isso éEntão você pode usar
$1
,$2
,for
etc. para trabalhar com os valores fornecidos.Tudo isso não é muito útil se você precisar de vários arrays. É aí que entra o truque
save
e : a função ¹ de Rich processa os parâmetros posicionais atuais e gera uma string, com aspas apropriadas, que pode ser usada para restaurar os valores armazenados. Assim você correeval
save
eval
para salvar a matriz de trabalho atual em
coords
, crie uma nova matriz, trabalhe com ela e, quando precisar trabalharcoords
novamente, vocêeval
:Para entender o exemplo, você deve considerar que está trabalhando com duas matrizes aqui, aquela com valores definidos anteriormente e que você armazena em
coords
, e a matriz contendo 1895, 955 etc. O trecho em si não faz muito sentido por conta própria, você teria algum processamento entre as linhasset
e .eval
Se você precisar retornar à matriz 1895, 955 posteriormente, salve-a primeiro antes de restaurarcoords
:Dessa forma, você pode restaurar
$newarray
mais tarde.¹ Definido como
A ideia é codificar a lista de strings arbitrárias em uma variável escalar em um formato que possa ser usado posteriormente para reconstruir a lista ou strings arbitrárias.
Quando você fica
set --
na frente disso, ele cria um código shell que reconstrói essa lista dex
stringsy z
e a armazena na$@
matriz, que você só precisaeval
atualizar.O
sed
cuida de citar corretamente cada string (adiciona'
no início da primeira linha, no final da última linha e substitui todos os'
s por'\''
).No entanto, isso significa executar um
printf
esed
comando para cada argumento, por isso é bastante ineficiente. Isso poderia ser feito de maneira mais direta com apenas uma invocação do awk: