Adiar a expansão de chaves é realmente um caso para eval
, particularmente Se você quiser restringir as coisas - expansão de parâmetro comum não faz a coisa certa no momento certo.
Isso deve fazer o que parece que você queria:
LIST={JF,JFE,RFS,JBF,JFI,JMCB}
for year in {1998..2000} {2009..2011}
do
eval "y$year=($LIST-$year)"
tmp="y$year[@]"
echo "${!tmp}"
done
Você não pode indiretamente em uma matriz, portanto, é necessário que a matriz seja restrita dentro de eval
também se você quiser imprimi-la. Se não, você pode retirar tudo depois do ;
. tmp
é usado para expansão indireta : com tmp
definido como "y$year[@]"
, onde $year
é substituído por seu valor, a expansão ${!tmp}
fornece o conteúdo da matriz desta iteração (o que ${y1998[@]}
, etc, teria se expandido para).
O texto acima será exibido:
JF-1998 JFE-1998 RFS-1998 JBF-1998 JFI-1998 JMCB-1998
JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999
JF-2000 JFE-2000 RFS-2000 JBF-2000 JFI-2000 JMCB-2000
JF-2009 JFE-2009 RFS-2009 JBF-2009 JFI-2009 JMCB-2009
JF-2010 JFE-2010 RFS-2010 JBF-2010 JFI-2010 JMCB-2010
JF-2011 JFE-2011 RFS-2011 JBF-2011 JFI-2011 JMCB-2011
e também criar matrizes y1998
... y2011
. Os declare
s não são estritamente necessários, embora eles deixem você pular um eval
se você está apontando para isso e não precisa se restringir.
Eu sugiro que isso provavelmente não seja o jeito que você realmente deseja alcançar seu objetivo subjacente, seja lá o que for. Loops aninhados não são malvados, e se algum deles for codificado, você pode abstrair isso.