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?


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.