web-dev-qa-db-fra.com

Différence entre $ {} et $ () dans Bash

J'ai deux questions et je pourrais avoir besoin d'aide pour les comprendre.

  1. Quelle est la différence entre ${} Et $()? Je comprends que () Signifie qu’il faut exécuter une commande dans un shell séparé et que placer $ Signifie qu’il faut passer la valeur à variable. Est-ce que quelqu'un peut m'aider à comprendre cela? S'il vous plait corrigez moi si je me trompe.

  2. Si nous pouvons utiliser for ((i=0;i<10;i++)); do echo $i; done et que tout fonctionne correctement, pourquoi ne puis-je pas l'utiliser comme while ((i=0;i<10;i++)); do echo $i; done? Quelle est la différence de cycle d'exécution pour les deux?

64
Anaadih.pradeep

La syntaxe est au niveau du jeton, la signification du signe dollar dépend donc du jeton dans lequel elle se trouve. L'expression $(command) est un synonyme moderne de `command` qui signifie substitution de commande; cela signifie, lancez command et mettez sa sortie ici. Alors

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

exécutera la commande date et inclura sa sortie dans l'argument de echo. Les parenthèses ne sont pas liées à la syntaxe permettant d'exécuter une commande dans un sous-shell, bien qu'elles aient quelque chose en commun (la substitution de commande s'exécute également dans un sous-shell séparé).

Par contre, ${variable} n'est qu'un mécanisme d'homonymie, vous pouvez donc dire ${var}text quand vous voulez dire, le contenu de la variable var, suivi de text (par opposition à $vartext ce qui signifie que le contenu de la variable vartext).

La boucle while attend un seul argument qui doit être considéré comme vrai ou faux (ou réellement multiple, où la valeur de vérité du dernier est examinée - merci à Jonathan Leffler de l'avoir signalé); quand c'est faux, la boucle n'est plus exécutée. La boucle for effectue une itération sur une liste d’éléments et lie chacun à une variable de boucle; la syntaxe à laquelle vous faites référence est un moyen - assez général - d'exprimer une boucle sur une plage de valeurs arithmétiques.

Une telle boucle for peut être reformulée comme une boucle while. L'expression

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

est équivalent à

init
while check; do
    body
    step
done

Il est logique de garder tout le contrôle de boucle au même endroit pour plus de lisibilité; mais comme vous pouvez le voir quand c'est exprimé ainsi, la boucle for en fait un peu plus que la boucle while.

Bien sûr, cette syntaxe est spécifique à Bash; classique Bourne Shell a seulement

for variable in token1 token2 ...; do

(Un peu plus élégamment, vous pourriez éviter le echo du premier exemple tant que vous êtes sûr que votre chaîne d'argument ne contient pas de % codes de format:

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

Il est important d’apprendre à éviter un processus où vous pouvez, même si cela ne change pas grand-chose dans cet exemple isolé.)

110
tripleee
  1. $() signifie: "évaluez-le d'abord, puis évaluez le reste de la ligne".

    Ex:

    echo $(pwd)/myFile.txt
    

    sera interprété comme

    echo /my/path/myFile.txt
    

    D'autre part ${} Développe une variable.

    Ex:

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

    sera interprété comme

    echo toto/myFile.txt
    
  2. Pourquoi ne puis-je pas l'utiliser comme bash$ while ((i=0;i<10;i++)); do echo $i; done

    Je crains que la réponse soit simplement que la syntaxe bash de while n’est tout simplement pas la même que celle de for.

43
gturri