echo nome da variável em loop

2

Eu tenho isso:

test1="1"
test2="2"
test3="3"

for i in "$test1" "$test2" "$test3"; do
        echo "$i"
done ;

Eu quero ecoar o nome da variável $i , não seu conteúdo.

A saída de eco deve ser "test1" ou "test2" ou "test3"

Como posso fazer isso?

    
por Leonardo Ortiz 19.06.2017 / 14:06

4 respostas

2

O significado de for i in "$test1" "$test2" "$test3" é: $i conterá o conteúdo das três variáveis test1, test2, test3 - que serão válidas: 1, 2, 3

Se você quiser imprimir test1 , test2 e test3 você deve chamá-los sem o sinal $ , ou seja, o nome real, não seu valor

O código a seguir (sem o $ antes das variáveis test1/2/3 imprimirão o que você deseja:

test1="1"
test2="2"
test3="3"

for i in "test1" "test2" "test3"; do
        echo "$i"
done ;

resultado da execução:

test1
test2
test3
    
por 19.06.2017 / 14:10
15

Se você realmente quiser fazer isso, faça isso:

#!/bin/bash
test1='1'
test2='2'
test3='3'
for v in "test1" "test2" "test3"; do
        echo "The variable's name is $v"
        echo "The variable's content is ${!v}"
done 

Mas você provavelmente preferiria usar matrizes em vez de nomes de variáveis dinâmicas, pois isso pode ser visto como uma prática ruim e dificultar a compreensão do código. Então, considere isso, muito melhor, forma:

#!/bin/bash
test[0]='1'
test[1]='2'
test[2]='3'
for ((i=0;i<=2;i++)); do
        echo "The variable's name is \$test[$i]"
        echo "The variable's content is ${test[$i]}"

done 
    
por 19.06.2017 / 14:23
4

Use aspas simples:

for i in '$test1' '$test2' '$test3'; do
    echo "$i"
done

ou então, escape dos cifrões com uma barra invertida:

for i in \$test1 \$test2 \$test3; do
    echo "$i"
done
    
por 19.06.2017 / 16:13
2

ksh93 ou Bash:

$ test1=aa; test2=bb; test3=cc
$ for x in "${!test@}" ; do echo "$x" ; done 
test1
test2
test3

(note que as variáveis são expandidas em ordem lexical (então test10 viria antes de test2 )).

    
por 19.06.2017 / 23:35