Toutes les constructions imbriquées qui peuvent être interpolées à l'intérieur de chaînes peuvent avoir d'autres chaînes à l'intérieur: elles sont analysées comme un nouveau script, jusqu'au marqueur de fermeture, et peuvent même être imbriquées à plusieurs niveaux. Tout sauf un commence par un $
. Tous sont documentés dans une combinaison du manuel Bash et de la spécification du langage de commande shell POSIX.
Il y a quelques cas de ces constructions:
Substitution de commandes avec$( ... )
, comme vous l'avez trouvé. POSIX spécifie ce comportement :
Avec le $(command)
formulaire, tous les caractères suivant la parenthèse ouvrante à la parenthèse fermante correspondante constituent la commande. Tout script shell valide peut être utilisé pour la commande ...
Les citations font partie de scripts shell valides, elles sont donc autorisées avec leur signification normale.
- Substitution de commandes utilisant
`
également.
L'élément "word" des instances de substitution de paramètres avancées telles que${parameter:-word}
. La définition de "mot" est :
Une séquence de caractères traités comme une unité par le shell
- qui inclut du texte entre guillemets et même des guillemets mixtes a"b"c'd'e
- bien que le comportement réel des extensions soit un peu plus libéral que cela, et par exemple ${x:-hello world}
fonctionne aussi.
Expansion arithmétique avec $(( ... ))
, bien qu'elle soit largement inutile là-bas (mais vous pouvez également imbriquer la substitution de commandes ou les extensions de variables, puis avoir des guillemets utiles à l'intérieur). POSIX déclare que :
L'expression doit être traitée comme si elle était entre guillemets doubles, sauf qu'un guillemet double à l'intérieur de l'expression n'est pas traité spécialement. Le shell doit développer tous les jetons dans l'expression pour l'expansion des paramètres, la substitution de commandes et la suppression des guillemets.
ce comportement est donc explicitement requis. Cela signifie echo "abc $((4 "*" 5))"
faire de l'arithmétique, plutôt que de globuler.
Notez cependant que l' $[ ... ]
expansion arithmétique à l' ancienne n'est pas traitée de la même manière: les guillemets seront une erreur s'ils apparaissent, que l'expansion soit citée ou non. Ce formulaire n'est plus du tout documenté et n'est pas destiné à être utilisé de toute façon.
- Traduction spécifique aux paramètres régionaux avec
$"..."
, qui utilise en fait l' "
élément central. $"
est traité comme une seule unité.
Il y a un autre cas d'imbrication auquel vous ne vous attendez pas, n'impliquant pas de guillemets, qui est avec l' expansion d'accolade : se {a,b{c,d},e}
développe en "a bc bd e". ${x:-a{b,c}d}
ne niche pas , cependant; il est traité comme une substitution de paramètres donnant " a{b,c
", suivi de " d}
". Cela est également documenté :
Lorsque des accolades sont utilisées, l'accolade de fin correspondante est le premier '}' non échappé par une barre oblique inverse ou dans une chaîne entre guillemets, et non dans une expansion arithmétique intégrée, une substitution de commande ou une expansion de paramètre.
En règle générale, toutes les constructions délimitées analysent leur corps indépendamment du contexte environnant (et les exceptions sont traitées comme des bogues ). En substance, en voyant $(
le code de commande de substitution demande que l'analyseur de consommer ce qu'il peut du corps comme si elle est un nouveau programme, puis vérifie que le marqueur de terminaison prévu (une séquence d' échappement )
ou ))
ou }
) apparaît une fois que les courses sous-analyseur des choses qu'il peut consommer.
Si vous pensez au fonctionnement d'un analyseur à descente récursive , ce n'est qu'une simple récursivité dans le cas de base. C'est en fait plus facile à faire que dans l'autre sens, une fois que vous avez une interpolation de chaîne. Quelle que soit la technique d'analyse sous-jacente, les shells supportant ces constructions donnent le même résultat.
Vous pouvez imbriquer des citations aussi profondément que vous le souhaitez à travers ces constructions et cela fonctionnera comme prévu. Nulle part ne se confondra en voyant une citation au milieu; au lieu de cela, ce sera le début d'une nouvelle chaîne entre guillemets dans le contexte intérieur.