a resposta de roaima responde à pergunta que você fez:
Q: What is the difference between these two code blocks? Why do they give different output?
A: The first loop is iterating over the command line arguments; the second one is iterating over the argument numbers (indices).
... embora eu presuma que você teria imaginado por si mesmo em outros seis a oito minutos - é meio óbvio. Você provavelmente quer que o segundo programa faça algo como
echo $$i # This doesn't do what you want.
para exibir o argumento indexado pelo número
que é armazenado na variável i (e referenciada como $i ).
Como observado no comentário, isso não faz o que você quer.
( faz fazer alguma coisa;
Encorajo-vos a experimentar e descobrir o que faz.)
Mas isso está perto de algo que funciona:
eval echo \$$i # Don't do this.
ou, equivalentemente,
eval echo '$'"$i" # Don't do this.
Estes comandos
- obtenha o valor de
i(um dos números 1, 2, 3, ...) - coloque um
$na frente dele, formando$1,$2,$3, etc. - use o comando
evalpara dizer "pegue esta linha de comando que eu acabei de construir, e eval uate como se eu tivesse digitado.
Então, isso teria o efeito de executar
echo $1
echo $2
echo $3
︙
Mas, como os comentários sugerem, você deve tentar evitar isso.
eval pode ser perigoso se a entrada for outra que não palavras simples.
Procure este site; você encontrará muitas explicações sobre isso.
Mas há uma maneira bastante segura de obter o segundo programa para fazer a mesma coisa que o primeiro faz: mudar
echo $i
para
echo ${!i}
OK, primeiro de tudo, ${i} é praticamente o mesmo que $i .
O ! fornece um efeito semelhante ao do comando eval -
${!x} procura o valor de x (por exemplo, $x ou ${x} )
e usa que como o nome da variável a ser pesquisada.
Então, se x=foo , então ${!x} é o mesmo que $foo .
O código acima faz o mesmo com i ,
buscando o parâmetro cujo nome é o valor de i .
A propósito, você deve sempre citar todas as referências a variáveis do shell
(por exemplo, "$i" , "$#" , "$args" , "${i}" e "${!i}" )
a menos que você tenha uma boa razão para não
e você tem certeza de que sabe o que está fazendo.