Estou executando meu script comoscript.sh 12345 12346 12347
for z in 1..$(seq 1 $#);
do
echo "param $z is $($(echo $z))"; //Line 4
done;
Estou esperando a saída como abaixo:
param 1 is 12345
param 2 is 12346
param 3 is 12347
Acho que estou perdendo alguma coisa na linha 4.
O problema
$($(echo $z))
é que ele se expande, primeiro para$(1)
(se$z
for 1) e depois o shell tenta executar1
como um comando.Assumindo
bash
:Executando:
Ou, com
/bin/sh
:Executando isso:
Isso se você realmente precisar enumerá-los explicitamente. Normalmente, seria apenas um loop
"$@"
:Isso se expandiria para
1..1
,2
,3
para três parâmetros.seq
já imprime os números como palavras distintas efor
não pode realmente gerar listas de números. A expansão de colchetes pode gerar listas de números, a sintaxe é{1..3}
, mas no Bash ela não suporta variáveis dentro dela.Então isso poderia ser escrito como
ou com chaves em ksh ou zsh:
Se você quiser se referir a uma variável indiretamente, você pode usar
${!var}
(no Bash) ondevar
contém o nome da variável, então, por exemploComo alternativa, você pode usar a notação de fatia em
$@
(deve funcionar em Bash/ksh/zsh):Mas, na verdade, apenas usar
for x in "$@"
para repetir os valores pode ser considerado mais idiomático. A numeração também é bastante simples de adicionar sem nenhum recurso específico do shell: