Perché l'uso di virgolette doppie per racchiudere le dichiarazioni di azione di awk produce risultati diversi rispetto a quando si usano virgolette singole per racchiuderle?


8

Se uso virgolette singole per racchiudere l'istruzione action di awk, funziona come previsto:

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {'print $2'}
linux-headers-3.13.0-27
linux-headers-3.13.0-27-generic
linux-headers-3.14.4-031404
linux-headers-3.14.4-031404-generic
linux-headers-generic
linux-image-3.13.0-27-generic
linux-image-3.14.4-031404-generic
linux-image-extra-3.13.0-27-generic
linux-image-generic
linux-libc-dev:i386
linux-sound-base

Ma se uso le virgolette doppie per racchiuderle, stampa l'intera riga anziché la colonna / campo particolare:

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {"print $2"}
ii  linux-headers-3.13.0-27                    3.13.0-27.50                                           all          Header files related to Linux kernel version 3.13.0
ii  linux-headers-3.13.0-27-generic            3.13.0-27.50                                           i386         Linux kernel headers for version 3.13.0 on 32 bit x86 SMP
ii  linux-headers-3.14.4-031404                3.14.4-031404.201405130853                             all          Header files related to Linux kernel version 3.14.4
ii  linux-headers-3.14.4-031404-generic        3.14.4-031404.201405130853                             i386         Linux kernel headers for version 3.14.4 on 32 bit x86 SMP
ii  linux-headers-generic                      3.13.0.27.33                                           i386         Generic Linux kernel headers
ii  linux-image-3.13.0-27-generic              3.13.0-27.50                                           i386         Linux kernel image for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-3.14.4-031404-generic          3.14.4-031404.201405130853                             i386         Linux kernel image for version 3.14.4 on 32 bit x86 SMP
ii  linux-image-extra-3.13.0-27-generic        3.13.0-27.50                                           i386         Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-generic                        3.13.0.27.33                                           i386         Generic Linux kernel image
ii  linux-libc-dev:i386                        3.13.0-27.50                                           i386         Linux Kernel Headers for development
ii  linux-sound-base                           1.0.25+dfsg-0ubuntu4                                   all          base package for ALSA and OSS sound systems

Perché è così? Perché l'uso di virgolette doppie per racchiudere le dichiarazioni di azione di awk produce risultati diversi rispetto a quando si usano virgolette singole per racchiuderle? Posso fare qualcosa in modo che racchiudere le virgolette doppie funzioni come racchiudere le virgolette singole?


Prova a usare le virgolette singole al di fuori delle parentesi graffe.
Avinash Raj,

@AvinashRaj Questo produrrebbe un errore di sintassi, tutte le istruzioni di azione awkdovrebbero essere all'interno { ... }.
Aditya,

chi dice che creerebbe un errore di sintassi? Awk sysntax sarebbe come questo, awk 'condition1{action1} condition2 {action2}'. Se diamo il comando awk in questo modo awk '{print $1}'significa che non viene fornita alcuna condizione.
Avinash Raj,

non ho detto che il tuo comando awk {'print $2'}è sbagliato. Ho detto, sarebbe meglio evitare virgolette singole tra parentesi graffe, perché ti confonderà.
Avinash Raj,

@AvinashRaj Oh .. Pensavo volessi dire qualcos'altro.
Aditya,

Risposte:


6

Se usi virgolette doppie, $2viene sostituito dalla shell prima che awkvenga chiamato. Come di $2solito è vuoto a correre

awk {"print $2"}

è uguale a correre

awk {"print "}

Uso

awk {"print \$2"}

se vuoi usare virgolette doppie.


Sto guardando i manuali come quando vengono eseguite le espansioni della shell . Non menziona nulla di virgolette singole o doppie. Perché l'espansione non viene eseguita in caso di virgolette singole? E da dove è $2stato ampliato Bash ? (Dal momento che sto cercando di imparare le cose, vorrei capire cosa sta succedendo) :)
Aditya

Oh .. trovato questo che spiega la differenza tra virgolette singole e doppie. È chiaro .. Ora, da dove è arrivato Bash $2?
Aditya,

Se stai lavorando sulla riga di comando $2è di solito una variabile d'ambiente vuota
Florian Diesch,

Ok, non sapevo che non è necessario definire una variabile in bash. Se bash non trova una variabile, la espande automaticamente come vuota. Questa risposta su Server Fault lo chiarisce.
Aditya,
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.