Como gerar novos nomes de variáveis dinamicamente

5

Estou tentando gerar nomes din dinâmicos em um script de shell para processar um conjunto de arquivos com nomes distintos em um loop da seguinte forma:

SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo SAMPLE{$i}
done

Espero que a saída:

1-first.with.custom.name
2-second.with.custom.name

mas eu tenho:

SAMPLE{1}
SAMPLE{2}

É possível gerar nomes var na mosca?

    
por pQB 30.05.2012 / 18:11

3 respostas

5

Por que não usar uma matriz, elas são destinadas a fazer coisas como essa?

sample[1]='1-first.with.custom.name'
sample[2]='2-second.with.custom.name'

for (( i = 1; i <= 2; i++ ))
do
  echo ${sample[$i]}
done

Além disso, não use nomes de variáveis com todas as maiúsculas no seu script para evitar o uso acidental de nomes de variáveis reservados.

    
por 30.05.2012 / 22:48
5

Descobri que posso obter os resultados esperados da seguinte forma:

for (( i = 1; i <= 2; i++ ))
do
  NEW_NAME=SAMPLE$i
  echo ${!NEW_NAME}
done
    
por 30.05.2012 / 18:37
3

Se você quiser fazer isso usando o shell padrão POSIX portátil e evitar extensões de bash como arrays, você precisa usar eval:

$ foo1='a b c'
$ foo2='d e f'
$ a=1; eval echo \$foo$a
a b c
$ a=2; eval echo \$foo$a
d e f
    
por 31.05.2012 / 03:17