Différence entre $ '$ foo' et $ "$ foo"


9

J'ai des difficultés à comprendre certaines nuances entre les guillemets simples et doubles dans un contexte variable

Je définis:

foo=pwd

puis exécutez-les:

echo $'$foo'

Quels échos $foo(ce qui signifie que le premier $de ma commande d'écho est supprimé)

echo $"$foo"

Cet écho pwd(ce qui signifie que le bash se développe $foo, ma variable, à sa valeur)

echo $`$foo`

Enfin cet écho $~/scripts(je m'attendais à ce qu'il s'imprime ~/scriptset non $~/scripts)

quelqu'un peut-il m'aider à comprendre ces différences?

Réponses:


11

En fin de compte, le dernier s'imprime $~/scriptscar $`foo`est une combinaison d'un littéral $suivi d'une substitution de commande; le début $est donc interprété comme un littéral $et le dernier `$foo`comme une substitution de commande.


J'ai supprimé les balises de code et remplace avec juste `` `` `` `` caractères , etc. Ne hésitez pas à rollback si vous préférez les balises de code
Tim

@Tim Merci, je ne sais pas exactement ce que j'ai fait, mais pour une raison quelconque, après que vous avez modifié le post, il est apparu aussi perturbé que dans ma première révision, alors je l'ai annulé ... Et maintenant, je vois que tout va bien dans la révision. Je ne sais pas ce qui s'est passé, je vais tester cela dans le bac à sable de mise en forme avant de revenir à votre version car je crains de ne plus perturber la publication. Quoi qu'il en soit, merci pour l'effort.
kos

bien sûr, aucun problème. Le mien utilise des espaces de largeur nulle, alors soyez prudent lorsque vous modifiez.
Tim

2

Premier cas:

echo $'$foo'

Quels échos $foo(ce qui signifie que le premier $de ma commande d'écho est supprimé)

Le premier $est exécuté comme une commande. Echo ne nécessite pas d'espaces entre les arguments, il les prend juste.

Donc, écho se $'$foo'développe pour exécuter la commande $(qui n'est pas une commande, donc il l'ignore), puis écho '$foo'. Tout ce qui ''est dedans est pris à sa valeur nominale - il ne l'étend pas ou quoi que ce soit. Vous pouvez mettre ce que vous voulez '' et rien ne se passe.

Si vous remplacez le $par, $$il fait écho à l'ID de processus.


Seconde:

echo $"$foo"

Cet écho pwd(ce qui signifie que le bash se développe $foo, ma variable, à sa valeur)

C'est parce que ""cela ne l'empêche pas de se développer. ""est normalement utilisé pour s'assurer qu'il existe une valeur à comparer.

Si vous avez une variable qui pourrait être vide (par exemple, elle provient d'un greprésultat), alors vous voulez comparer avec une autre valeur / variable, vous devez mettre la première variable dedans "". Cela garantit qu'il y a toujours une comparaison à vérifier, plutôt qu'une simple section de code vide (comme le voit bash) qui donne une erreur.


Enfin, le numéro 3. C'est intéressant.

echo $`$foo`

Cet écho $~/scripts(je m'attendais à ce qu'il s'imprime ~/scriptset non $~/scripts)

C'est parce que (dans ce cas) l'écho imprime d'abord le $caractère. Mettre quelque chose entre guillemets provoque l' exécution de la valeur de la variable en tant que commande (la meilleure façon de le faire dans les versions plus récentes de bash est $(command))

Donc, d'abord, il fait écho $puis il se développe ​`$foo`​vers ​`pwd`​lequel est exécuté et retourne ~/Scripts. Mais nous avons eu l' $impression plus tôt - donc la sortie entière est $~/Scripts.


Beau travail sur un formatage très difficile!
Arronical

1
@Arronical Thanks :) Vous ne pouvez pas le voir mais il y a des espaces de largeur nulle pour la dernière phrase. Les choses que je fais pour les points Internet imaginaires ...!
Tim

1
+1 Bonne réponse. J'ajouterais simplement que la citation des variables devrait être la valeur par défaut, sauf si vous avez une raison spécifique de ne pas le faire - pas seulement pour gérer les éventuelles valeurs nulles. Voir unix.stackexchange.com/questions/171346/… pour plus que vous n'avez jamais voulu en savoir plus. ;)
Joe
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.