A idéia é 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 cadeias arbitrárias.
$ save_pseudo_array x "y z" $'x\ny' "a'b"
'x' \
'y z' \
'x
y' \
'a'\''b' \
$
Quando você coloca set --
na frente disso, ele cria um código de shell que reconstrói essa lista de x
, y z
strings e a armazena na matriz $@
, que você precisa apenas de eval
uate .
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 comando printf
e sed
para cada argumento, por isso é bastante ineficiente. Isso poderia ser feito de uma forma mais direta com apenas uma invocação awk:
save_pseudo_array() {
LC_ALL=C awk -v q=\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q "\" q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
}' "$@"
}