Dlaczego użycie podwójnych cudzysłowów w celu zawarcia instrukcji akcji awk daje inne wyniki niż użycie pojedynczych cudzysłowów w celu ich zawarcia?

8

Jeśli użyję pojedynczych cudzysłowów, aby załączyć instrukcję akcji awk, działa ona zgodnie z oczekiwaniami:

$ 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

Ale jeśli użyję podwójnych cudzysłowów, aby je zawrzeć, wypisze całą linię zamiast określonej kolumny / pola:

$ 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

Dlaczego tak jest Dlaczego użycie podwójnych cudzysłowów w celu zawarcia instrukcji akcji awk daje inne wyniki niż użycie pojedynczych cudzysłowów w celu ich zawarcia? Czy mogę zrobić coś, aby dołączanie za pomocą podwójnych cudzysłowów działało jak załączanie za pomocą pojedynczych cudzysłowów?

Aditya
źródło
Staraj się używać pojedynczych cudzysłowów poza nawiasami klamrowymi.
Avinash Raj
@AvinashRaj To spowodowałoby błąd składniowy, wszystkie instrukcje akcji awkpowinny znajdować się wewnątrz { ... }.
Aditya
kto mówi, że spowoduje to błąd składniowy? Awk sysntax byłoby tak, awk 'condition1{action1} condition2 {action2}'. Jeśli wydamy polecenie awk w ten awk '{print $1}'sposób, oznacza to, że nie ma żadnego warunku.
Avinash Raj
nie powiedziałem, że twoje polecenie awk {'print $2'}jest złe. Powiedziałem, że lepiej byłoby unikać pojedynczych cudzysłowów w nawiasach klamrowych, ponieważ będzie to mylące.
Avinash Raj
@AvinashRaj Oh .. Myślałem, że masz na myśli coś innego.
Aditya

Odpowiedzi:

6

Jeśli użyjesz podwójnych cudzysłowów, $2zostanie wcześniej zastąpiony przez powłokę awk. Jak $2zwykle działa pusto

awk {"print $2"}

jest taki sam jak bieganie

awk {"print "}

Posługiwać się

awk {"print \$2"}

jeśli chcesz użyć podwójnych cudzysłowów.

Florian Diesch
źródło
Ja patrząc na podręcznikach, jak w przypadku rozszerzenia powłoki wykonywane . Nie wspomina nic o pojedynczych lub podwójnych cudzysłowach. Dlaczego interpretacja nie jest wykonywana w przypadku pojedynczych cudzysłowów? A skąd bash miał $2zostać rozwinięty? (Ponieważ próbuję się uczyć, chciałbym zrozumieć, co się dzieje) :)
Aditya
Och .. znalazłem to, co wyjaśnia różnicę między pojedynczymi i podwójnymi cudzysłowami. To jasne .. Skąd się wzięło bash $2?
Aditya
Jeśli pracujesz w wierszu poleceń, $2zwykle jest to pusta zmienna środowiskowa
Florian Diesch
Okej, nie wiedziałem, że nie trzeba definiować zmiennej w bash. Jeśli bash nie znajdzie zmiennej, automatycznie rozwija ją jako pustą. Ta odpowiedź na błąd serwera usuwa to.
Aditya