Diferença entre $ {} e $ () no Bash

Eu tenho duas perguntas e poderia usar alguma ajuda para entendê-las.

  1. Qual é a diferença entre ${} e $() ? Eu entendo que () significa executar o comando no shell separado e colocar $ significa passar o valor para a variável. Alguém pode me ajudar a entender isso? Por favor corrija-me se eu estiver errado.

  2. Se pudermos usar for ((i=0;i<10;i++)); do echo $i; done for ((i=0;i<10;i++)); do echo $i; done for ((i=0;i<10;i++)); do echo $i; done e funciona bem, então porque não posso usá-lo como while ((i=0;i<10;i++)); do echo $i; done while ((i=0;i<10;i++)); do echo $i; done while ((i=0;i<10;i++)); do echo $i; done ? Qual é a diferença no ciclo de execução para ambos?

A syntax é em nível de token, então o significado do sinal de dólar depende do token em que ele está. A expressão $(command) é um sinônimo moderno para `command` que significa substituição de comando; isso significa, execute o command e coloque sua saída aqui. assim

 echo "Today is $(date). A fine day." 

irá executar o comando date e include sua saída no argumento para echo . Os parênteses não estão relacionados à syntax para executar um comando em um subshell, embora eles tenham algo em comum (a substituição de comando também é executada em um subshell separado).

Por outro lado, ${variable} é apenas um mecanismo de desambiguação, então você pode dizer ${var}text quando você quer dizer, o conteúdo da variável var , seguido por text (ao contrário de $vartext que significa, o conteúdo da variável vartext ).

O loop while espera um único argumento que deve ser avaliado como verdadeiro ou falso (ou, na verdade, múltiplo, onde o último valor de verdade é examinado – obrigado Jonathan Leffler por apontar isto); quando é falso, o loop não é mais executado. O loop for itera sobre uma lista de itens e liga cada um a uma variável de loop por sua vez; a syntax a que você se refere é uma maneira bastante generalizada de expressar um loop sobre uma faixa de valores aritméticos.

Um loop for como esse pode ser reformulado como um loop while. A expressão

 for ((init; check; step)); do body done 

é equivalente a

 init while check; do body step done 

Faz sentido manter todo o controle de loop em um único lugar para legibilidade; mas como você pode ver quando é expresso dessa forma, o loop for faz um pouco mais do que o loop while.

Claro, essa syntax é específica do Bash; Bourne shell clássico só tem

 for variable in token1 token2 ...; do 

(Um pouco mais elegantemente, você poderia evitar o echo no primeiro exemplo, desde que tenha certeza de que sua string de argumento não contém nenhum código de formato % :

 date +'Today is %c. A fine day.' 

Evitar um processo em que você pode é uma consideração importante para aprender, mesmo que não faça muita diferença nesse exemplo isolado.

  1. $() significa: “primeiro avalie isso e, em seguida, avalie o restante da linha”.

    Ex:

     echo $(pwd)/myFile.txt 

    será interpretado como

     echo /my/path/myFile.txt 

    Por outro lado, ${} expande uma variável.

    Ex:

     MY_VAR=toto echo ${MY_VAR}/myFile.txt 

    será interpretado como

     echo toto/myFile.txt 
  2. Por que não posso usá-lo como bash$ while ((i=0;i<10;i++)); do echo $i; done bash$ while ((i=0;i<10;i++)); do echo $i; done

    Receio que a resposta seja apenas que a syntax bash para while não é a mesma que a syntax for .

  1. sua compreensão está certa. Para informações detalhadas sobre {} consulte bash ref – parameter expansion

  2. ‘for’ e ‘while’ possuem syntax diferente e oferecem diferentes estilos de controle de programador para uma iteração. A maioria das linguagens não-asm oferece uma syntax semelhante.

Com o tempo, você provavelmente escreveria i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done em essência gerenciar tudo sobre a iteração você mesmo