Acessando o número / variável de iteração da expansão da chave bash [internal]

1

Pergunta:

É possível acessar qual número de uma iteração bash está sendo processada atualmente?

Psuedo-Command

mv {1..5}.something.{1..5} $x1.$x2.something
  • Nota: Esta é uma representação lógica; uma amostra não funcional.

Pseudo-Output

mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
  • Onde n e m são a iteração de sua respectiva expansão de contraventamento.

Explicação

Estou familiarizado com loops como:

for x in {1..10}; do echo -n "$x "; done

Como você pode ver, o bash está configurando a iteração para $ x. Desejo aprender se é possível e como acessar a variável que o bash usa quando não estou definindo qual variável usar. Quando o bash recebe uma expansão de chave sem uma variável para iterar, ele deve fazê-lo [internamente] de alguma forma. Estou esperando que essa variável esteja acessível no tempo de execução do script.

Obrigado a todas as pessoas do #bash

    
por earthmeLon 28.03.2012 / 02:20

3 respostas

5

Você está entendendo mal como a expansão de chaves funciona. Por favor, leia novamente o comentário de Dennis Williamson acima.

Você está pensando que quando eu escrevo mv foo.{1,2,3} bar , o shell está invocando o comando várias vezes, como se você tivesse digitado:

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar

Se isso fosse verdade, sua pergunta faria sentido: o shell está executando vários comandos e, portanto, precisa manter uma lista.

Mas não é isso que está acontecendo. A expansão de chave expande um único argumento e, em seguida, invoca a linha de comandos uma vez . Portanto, para o exemplo acima, o shell vê que o argumento foo.{1,2,3} contém expansão de chave e expande esse argumento em três argumentos foo.1 foo.2 foo.3 . Em seguida, ele insere essa expansão na linha de comando no lugar do argumento braced e, em seguida, continua analisando a linha de comando. Quando terminar, o shell executa um comando, que ficaria assim:

mv foo.1 foo.2 foo.3 bar

Então, sim, provavelmente, quando o shell estiver expandindo esse argumento, ele manterá uma lista, mas não há como acessar essa lista na expansão de outros argumentos porque a expansão de chave está totalmente concluída e todas as informações sobre a expansão estão esgotadas. e esquecido no momento em que os outros argumentos estão sendo analisados.

A única maneira de tal argumento ser útil, de qualquer forma, seria se o shell estivesse executando vários comandos, o que não é. Para executar vários comandos, você precisa usar um loop real; A expansão do aparelho não faz isso.

Quanto a $_ , essa é uma construção de Perl que pode ser usada no lugar de uma variável de loop (como x em seu exemplo de loop), portanto, não é realmente relevante fortalecer a expansão.

    
por 28.03.2012 / 14:16
2

Para mv especificamente, você pode simplesmente usar o sinal -v para ver o que está sendo processado no momento. Como apontou @DennisWilliamson, nenhuma variável está definida para a seqüência expandida da chave - Escrever echo {1..5} é equivalente a escrever echo 1 2 3 4 5 . Compare com echo "$foo" - Não há como saber qual variável foi echo ed.

    
por 28.03.2012 / 11:49
0

por que você não usa sua própria variável para contar o número da iteração e ecoá-lo. Se você quiser ver o que está acontecendo na execução, execute-o com a opção -x. Como bash -x dirá onde ex. Mas sem especificar o que você está tentando alcançar, é uma ajuda difícil.

    
por 28.03.2012 / 10:14