Differenza tra $ '$ foo' e $ “$ foo”


9

Sto avendo difficoltà a capire alcune sfumature tra virgolette singole e doppie in un contesto variabile

Io definisco:

foo=pwd

quindi esegui questi:

echo $'$foo'

Which echos $foo(ovvero il primo $nel mio comando echo viene eliminato)

echo $"$foo"

Questo eco pwd(che significa che la bash si espande $foo, la mia variabile, al suo valore)

echo $`$foo`

Finalmente questo eco $~/scripts(mi aspettavo che stampasse ~/scriptse non $~/scripts)

qualcuno può aiutarmi a capire queste differenze?

Risposte:


11

Alla fine, l'ultimo stampa $~/scriptsperché $`foo`è una combinazione di un letterale $seguito da una sostituzione di comando; quindi il comando $è interpretato come un letterale $e il finale `$foo`come una sostituzione di comando.


Ho rimosso i tag di codice e li ho sostituiti con solo caratteri `` `` `` `ecc. Sentiti libero di eseguire il rollback se preferisci i tag di codice
Tim

@Tim Grazie, non sono sicuro di cosa ho fatto esattamente, ma per qualche motivo dopo la tua modifica il post è apparso interrotto come nella mia prima revisione, quindi l'ho ripristinato ... E ora vedo che sembra ok nella revisione. Non sono sicuro di cosa sia successo, lo testerò nella sandbox di formattazione prima di tornare alla tua versione poiché temo di poter interrompere di nuovo il post. Indipendentemente da ciò, grazie per lo sforzo.
kos,

certo, nessun problema. Il mio utilizza spazi di larghezza zero, quindi fai attenzione mentre modifichi.
Tim

2

Primo caso:

echo $'$foo'

Which echos $foo(ovvero il primo $nel mio comando echo viene eliminato)

Il primo $viene eseguito come comando. L'eco non richiede spazi tra gli argomenti, li prende semplicemente.

Quindi echo si $'$foo'espande per eseguire il comando $(che non è un comando quindi lo ignora) e quindi echo '$foo'. Qualsiasi cosa ''viene presa al valore nominale - non la espande o altro. Puoi mettere quello che vuoi in '' e non succede nulla.

Se lo si sostituisce $con $$echo l'ID del processo.


Secondo:

echo $"$foo"

Questo eco pwd(che significa che la bash si espande $foo, la mia variabile, al suo valore)

Questo perché ""non impedisce che si espanda. ""viene normalmente utilizzato per garantire che vi sia un valore da confrontare.

Se hai una variabile che potrebbe essere vuota (ad es. Da un greprisultato), allora vuoi confrontarla con un altro valore / variabile, devi inserire la prima variabile "". Questo assicura che ci sia sempre un confronto da verificare, piuttosto che solo una sezione vuota del codice (come vede bash) che dà un errore.


Infine, il numero 3. Questo è interessante.

echo $`$foo`

Questo eco $~/scripts(mi aspettavo che stampasse ~/scriptse non $~/scripts)

Questo perché (in questo caso) l'eco sta stampando $prima il personaggio. Mettere qualcosa nei backtick fa sì che il valore della variabile venga eseguito come comando (il modo migliore per farlo nelle versioni più recenti di bash è $(command))

Quindi prima echo $poi si espande ​`$foo`​a ​`pwd`​cui viene eseguito e ritorna ~/Scripts. Ma avevamo la $stampa in precedenza - quindi l'intero risultato è $~/Scripts.


Bel lavoro su alcune formattazioni molto difficili!
Arronical,

1
@Arronical Thanks :) Non puoi vederlo ma ci sono alcuni spazi di larghezza zero lì per l'ultima frase. Le cose che faccio per i punti internet immaginari ...!
Tim

1
+1 buona risposta. Vorrei solo aggiungere che le variabili di quotazione dovrebbero essere predefinite a meno che tu non abbia un motivo specifico per non farlo - non solo per gestire possibili valori null. Vedi unix.stackexchange.com/questions/171346/… per più di quanto tu abbia mai voluto sapere su questo. ;)
Joe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.