J'ai deux questions et je pourrais avoir besoin d'aide pour les comprendre.
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.
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?
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é.)
$()
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
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
.