Quand à envelopper des guillemets autour d'une variable d'environnement?
Quelqu'un pourrait-il me dire si oui ou non je dois envelopper les guillemets autour de variables dans un script shell?
Par exemple, est la suivante correct:
xdg-open $URL
[ $? -eq 2 ]
ou
xdg-open "$URL"
[ "$?" -eq "2" ]
Et si oui, pourquoi?
Il n'y a pas de questions stupides. Eh bien, il y a sont, mais ce n'est pas l'un d'eux 🙂
Voir aussi unix.stackexchange.com/questions/171346/...
Cette question reçoit beaucoup de doublons, dont beaucoup ne sont pas sur les variables, j'ai donc intitulé "valeur" au lieu de "variable". J'espère que cela va aider plus de gens à trouver ce sujet.
Qu'est-ce que le revenue modifier?
Connexes: la Différence entre les guillemets simples et doubles dans Bash.
Voir aussi unix.stackexchange.com/questions/171346/...
Cette question reçoit beaucoup de doublons, dont beaucoup ne sont pas sur les variables, j'ai donc intitulé "valeur" au lieu de "variable". J'espère que cela va aider plus de gens à trouver ce sujet.
Qu'est-ce que le revenue modifier?
Connexes: la Différence entre les guillemets simples et doubles dans Bash.
OriginalL'auteur Cristian | 2012-04-08
Vous devez vous connecter pour publier un commentaire.
Règle générale: devis d'elle si elle peut être vide ou contenir des espaces (ou n'importe quel espace vraiment) ou de caractères spéciaux (caractères génériques). Ne pas citer les chaînes de caractères avec des espaces souvent conduit à la coquille se briser d'un seul argument dans de nombreux.
$?
n'a pas besoin de guillemets parce que c'est une valeur numérique. Si$URL
besoins dépend de ce que vous permettent de là et si vous voulez encore un argument si elle est vide.J'ai tendance à toujours citer des chaînes de caractères de sortir de l'habitude, car il est plus sûr de cette façon.
Si vous n'êtes pas sûr de ce que pourrait être dans la variable, il est plus sûr de le citer. J'ai tendance à suivre le même principe que paxdiablo, et juste prendre l'habitude de citer tout (sauf si il y a une raison particulière de ne pas).
Si vous ne connaissez pas la valeur de l'IFS, le citer n'importe quoi. Si
IFS=0
, puisecho $?
peut être très surprenant.Important: Vous devez également citer si la valeur de la variable peut contenir des caractères génériques tels que *.
Derek, je crois que ce serait suffisamment couvert par mon " contenir d'espace vide, ou le commentaire.
OriginalL'auteur paxdiablo
En bref, devis tout où vous n'avez pas besoin de la shell pour effectuer jeton de fractionnement et de l'expansion des caractères génériques.
Guillemets simples de protéger le texte entre textuellement. C'est le propre de l'outil lorsque vous devez vous assurer que le shell ne pas toucher la corde. Généralement, c'est le citant le mécanisme de choix lorsque vous n'avez pas besoin interpolation de variable.
Les guillemets sont adaptés lors de l'interpolation de variable est nécessaire. Avec les adaptations appropriées, il est également une bonne solution lorsque vous avez besoin des guillemets simples dans la chaîne. (Il n'y a pas de façon simple d'échapper à une seule citation entre guillemets simples, car il n'existe pas de mécanisme d'échappement à l'intérieur des guillemets simples-s'il y avait, ils ne seraient pas citer complètement verbatim.)
Pas de guillemets sont appropriées lorsque vous exiger le shell pour effectuer jeton de fractionnement et/ou à l'expansion des caractères génériques.
Jeton de fractionnement;
Par contraste:
(La boucle ne s'exécute une fois, sur l'unique chaîne de caractères entre guillemets.)
(La boucle ne s'exécute une fois, plus le littéral simple chaîne de caractères entre guillemets.)
Expansion des caractères génériques:
Par contraste:
(Il n'existe pas de fichier nommé littéralement
file*.txt
.)(Il n'existe pas de fichier nommé
$pattern
!)En termes plus concrets, tout ce qui contient un nom de fichier doit généralement être cité (parce que les noms de fichiers peuvent contenir d'espaces et d'autres shell métacaractères). Tout ce qui contient une URL doit généralement être cité (parce que de nombreuses adresses contiennent shell métacaractères comme
?
et&
). Tout ce qui contient une regex doit généralement être cité (idem idem idem idem). Tout ce qui contient d'importants espaces autres que les espaces entre les caractères espace doit être cité (parce que sinon, le shell va munge l'espace, de manière efficace, les espaces, et couper les espaces avant ni après).Lorsque vous savez qu'une variable ne peut contenir qu'une valeur qui ne contient pas de shell métacaractères, citant est facultatif. Ainsi, un non-cotées
$?
est fondamentalement bien, parce que cette variable ne peut contenir qu'un seul numéro. Cependant,"$?"
est également correct, et recommandé pour la cohérence générale et de l'exactitude (même si c'est ma recommandation personnelle, pas un fait largement reconnu de la politique).Valeurs qui ne sont pas des variables essentiellement de suivre les mêmes règles, mais vous pouvez aussi échapper à toute caractères de remplacement au lieu de les citer. Pour un exemple, une URL avec un
&
dans il sera analysé par le shell comme un fond de commande, à moins que le caractère de remplacement est échappé ou cité:(Bien sûr, cela se produit également si l'URL est dans le non coté variable). Pour une chaîne statique, entre guillemets simples à faire le plus de sens, bien que toute forme de citations ou d'échapper fonctionne ici.
Le dernier exemple, suggère également un autre concept utile, ce que j'aime appeler "balançoire en citant". Si vous avez besoin de mélanger les guillemets simples et doubles, vous pouvez les utiliser adjacents les uns aux autres. Par exemple, la cité des chaînes
peuvent être collées ensemble, dos à dos, formant une longue chaîne après la segmentation et devis de déménagement.
Ce n'est pas très lisible, mais c'est une technique courante et donc bon à savoir.
Que d'un côté, les scripts ne devrait généralement pas utiliser
ls
pour n'importe quoi. Pour développer un générique, juste ... l'utiliser.(La boucle est complètement inutile dans le dernier exemple;
printf
spécifiquement fonctionne très bien avec plusieurs arguments.stat
trop. Mais en boucle sur une wildcard match est un problème commun, et souvent fait de manière incorrecte.)Une variable contenant une liste de jetons en boucle ou un générique pour élargir l'est moins fréquemment observée, de sorte que nous avons parfois l'abréviation de "citation tout, sauf si vous savez précisément ce que vous faites".
Je note que c'est l'élément n ° 0 et un thème récurrent sur le mywiki.wooledge.org/BashPitfalls la collection de communes Bash erreurs. Beaucoup, beaucoup d'éléments de cette liste sont essentiellement à propos de cette question.
Très bonne explication, merci!
OriginalL'auteur tripleee
Ici est un trois-point de la formule de devis en général:
Guillemets
Dans les contextes où nous voulons supprimer le mot de fractionnement et d'expansion. Également dans des contextes où nous voulons que le littéral à être traitée comme une chaîne, pas un regex.
Guillemets simples
Dans les littéraux de chaîne où nous voulons supprimer l'interpolation et le traitement spécial des barres obliques inverses. En d'autres termes, les situations où l'aide de guillemets doubles serait inapproprié.
Pas de guillemets
Dans les contextes où nous sommes absolument convaincus qu'il n'y a pas de couper un mot ou d'expansion des questions ou nous ne voulez couper un mot et d'expansion.
Exemples
Guillemets
"StackOverflow rocks!"
,"Steve's Apple"
)"$var"
,"${arr[@]}"
)"$(ls)"
,"`ls`"
)"/my dir/"*
)"single'quote'delimited'string"
)"${filename##*/}"
)Guillemets simples
'Really costs $$!'
,'just a backslash followed by a t: \t'
)'The "crux"'
)$'\n\t'
)$'{"table": "users", "where": "first_name"=\'Steve\'}'
)Pas de guillemets
$$
,$?
,$#
etc.)((count++))
,"${arr[idx]}"
,"${string:start:length}"
[[ ]]
expression qui est gratuit à partir de word de fractionnement et d'expansion des questions (c'est une question de style et les opinions peuvent varier largement)for word in $words
)for txtfile in *.txt; do ...
)~
être interprété comme$HOME
(~/"some dir"
mais pas"~/some dir"
)Voir aussi:
"ls" "/"
Le membre de phrase "toutes les chaînes de caractères contextes" doit être qualifié avec plus de soin.Dans
[[ ]]
, citant une question sur le côté droit de=
/==
et=~
: il fait la différence entre l'interprétation d'une chaîne de caractères comme un modèle/regex ou littéralement.Un bon aperçu, mais @BenjaminW. les commentaires valent de l'intégration et de la norme ANSI C-chaînes entre guillemets (
$'...'
) devrait certainement avoir leur propre section.en effet, ils sont équivalents. Ces lignes directrices indiquent que vous devez toujours type
"ls" "/"
au lieu de la plus communels /
, et je prends ça comme un défaut majeur dans les lignes directrices.Pour pas de guillemets vous pouvez ajouter une affectation de variable ou
case
🙂OriginalL'auteur codeforester
J'utilise généralement cité comme
"$var"
de sécurité, sauf si je suis sûr que$var
ne contiennent pas d'espace.Je ne l'utilisation de
$var
comme un moyen simple de rejoindre les lignes:OriginalL'auteur Bach Lien
D'utilisation des variables dans le script shell à utiliser "" la cité des variables comme la cité signifie que la variable peut contenir des espaces ou des caractères spéciaux qui n'affecte pas l'exécution de votre script shell. Sinon si vous êtes sûr de ne pas avoir des espaces ou des caractères spéciaux dans votre nom de variable puis vous pouvez les utiliser sans les " ".
Exemple:
echo "$nom de l'url" -- ( Peut être utilisé à tout moment )
echo "$nom de l'url" -- ( Ne peut pas être utilisé à de telles situations afin de prendre des précautions avant de l'utiliser )
OriginalL'auteur Vipul Sharma