bash nomes de variáveis dinâmicas (variáveis)

4

Eu quero criar dinamicamente uma seqüência de strings manipulando uma matriz de elementos e criar algum procedimento aritmético.

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "\n"
done

O resultado desejado seria o abaixo para $6 igual a 0 .

1q;d
2q;d
3q;d
4q;d
5q;d

Mas eu recebo este erro

reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution

Eu acho que é algo simples. Costumava funcionar quando eu fazia algo como

FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
    
por giannis christofakis 11.08.2015 / 12:54

4 respostas

9

Em primeiro lugar, não pode haver nenhum espaço em torno de = na declaração de variável em bash .

Para obter o que você deseja, você pode usar eval .

Por exemplo, um exemplo de script como o seu:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    eval "$name"="'$(( $i + 1 ))q;d'"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

Impressões:

1q;d
2q;d
3q;d
4q;d
5q;d

Use eval cautelosamente, algumas pessoas o chamam de mal por algum motivo válido.

declare também funcionaria:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    declare "$name"="$(( $i + 1 ))q;d"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

também imprime:

1q;d
2q;d
3q;d
4q;d
5q;d
    
por 11.08.2015 / 13:48
7

Se você quiser fazer referência a uma variável bash com o nome armazenado em outra variável, faça o seguinte:

$ var1=hello
$ var2=var1
$ echo ${!var2}
hello

Você armazena o nome da variável que você deseja acessar, digamos, var2 neste caso. Então você o acessa com ${!<varable name>} , em que <variable name> é uma variável que contém o nome da variável que você deseja acessar.

    
por 11.08.2015 / 21:08
1
index=0;                                                                                                                                                                                                           
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    name=$(($index + 1))
    echo "${name}q;d"
    index=$((index+1))
done

É isso que você está tentando?

    
por 11.08.2015 / 13:40
1

O que recebo do seu código e sua saída desejada (corrija-me se estiver errado):
Não há uso dos nomes das variáveis "FIRST" / "SECOND" / ..., você só precisa de um loop com um índice ...

Isso fará o trabalho:

for i in {1..5} ; do echo $i"q;d" ; done

    
por 11.08.2015 / 13:51

Tags