Recherche…


Syntaxe

  • \ C (n'importe quel caractère sauf newline)
  • «Tout littéral sauf les guillemets simples»; 'ceci:' \ '' est une citation simple '
  • $ 'only \\ et \' sont spéciaux; \ n = nouvelle ligne, etc. '
  • "$ variable et autre texte; \" \\\ $ \ `sont spéciaux"

Newlines et caractères de contrôle

Une nouvelle ligne peut être incluse dans une chaîne simple ou entre guillemets. Notez que backslash-newline n'aboutit pas à une nouvelle ligne, le saut de ligne est ignoré.

newline1='
'
newline2="
"
newline3=$'\n'
empty=\

echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"

Vous pouvez utiliser des chaînes, des barres obliques inverses ou des barres obliques inverses pour insérer des caractères de contrôle, comme dans de nombreux autres langages de programmation.

echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'

Double guillemets pour la substitution de variables et de commandes

Les substitutions de variables doivent uniquement être utilisées entre guillemets.

calculation='2 * 3'
echo "$calculation"         # prints 2 * 3
echo $calculation           # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))"    # prints 6

En dehors des guillemets, $var prend la valeur de var , la divise en parties délimitées par des espaces et interprète chaque partie comme un motif glob (wildcard). À moins que vous ne vouliez ce comportement, placez toujours $var guillemets: "$var" .

La même chose s’applique aux substitutions de commandes: "$(mycommand)" est le résultat de mycommand , $(mycommand) est le résultat de split + glob sur la sortie.

echo "$var"             # good
echo "$(mycommand)"     # good 
another=$var            # also works, assignment is implicitly double-quoted
make -D THING=$var      # BAD! This is not a bash assignment.
make -D THING="$var"    # good
make -D "THING=$var"    # also good

Les substitutions de commandes ont leurs propres contextes de cotation. Ecrire des substitutions arbitrairement imbriquées est facile car l'analyseur gardera une trace de la profondeur d'imbrication au lieu de rechercher avec avidité le premier " caractère. Le surligneur de la syntaxe StackOverflow analyse cependant cette erreur. Par exemple:

echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”

Les arguments variables d'une substitution de commande doivent également être entre guillemets à l'intérieur des extensions:

echo "$(mycommand "$arg1" "$arg2")"

Citant le texte littéral

Tous les exemples de ce paragraphe impriment la ligne

!"#$&'()*;<=>?  @[\]^`{|}~

Une barre oblique inverse cite le caractère suivant, c’est-à-dire que le caractère suivant est interprété littéralement. La seule exception est une nouvelle ligne: backslash-newline se développe en une chaîne vide.

echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~

Tout le texte entre guillemets simples (guillemets ' , également appelé apostrophe, est imprimé littéralement. Même les barres obliques inverses se représentent, et il est impossible d'inclure un seul devis. Au lieu de cela, vous pouvez arrêter la chaîne littérale, inclure un guillemet simple littéral avec une barre oblique inverse et redémarrer la chaîne littérale. Ainsi, la séquence de 4 caractères '\'' permet effectivement d'inclure une seule citation dans une chaîne littérale.

echo '!"#$&'\''()*;<=>?  @[\]^`{|}~'
#          ^^^^

Dollar-single-quote lance une chaîne littérale $'…' comme beaucoup d'autres langages de programmation, où la barre oblique inverse cite le caractère suivant.

echo $'!"#$&\'()*;<=>?  @[\\]^`{|}~'
#           ^^            ^^

Les guillemets doubles " délimitent des chaînes semi-littérales où seuls les caractères " \ $ et ` conservent leur signification particulière. Ces caractères ont besoin d'une barre oblique inverse avant (notez que si la barre oblique inverse est suivie par un autre caractère, la barre oblique inverse reste). Les guillemets doubles sont surtout utiles pour inclure une variable ou une substitution de commande.

echo "!\"#\$&'()*;<=>?  @[\\]^\`{|}~"
#      ^^                 ^^  ^^
echo "!\"#\$&'()*;<=>?  @[\]^\`{|}~"
#      ^^                 ^  ^^      \[ prints \[

Interactivement, méfiez-vous de cela ! déclenche l'expansion de l'historique entre guillemets: "!oops" recherche une ancienne commande contenant oops ; "\!oops" ne permet pas l'expansion de l'historique mais conserve la barre oblique inverse. Cela ne se produit pas dans les scripts.

Différence entre guillemet double et devis unique

Double citation Simple citation
Permet l'expansion des variables Empêche l'expansion variable
Permet l'expansion de l'historique si activé Empêche l'expansion de l'histoire
Autorise la substitution de commandes Empêche la substitution de commande
* et @ peuvent avoir une signification particulière * et @ sont toujours des littéraux
Peut contenir à la fois une citation simple ou double Le devis unique n'est pas autorisé dans un devis unique
$ , ` , " , \ peut être échappé avec \ pour empêcher leur signification particulière Tous sont littéraux

Propriétés communes aux deux:

  • Empêche la globulation
  • Empêche le fractionnement de mots

Exemples:

$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow