Mengapa menggunakan tanda kutip ganda untuk melampirkan pernyataan tindakan awk menghasilkan hasil yang berbeda daripada ketika menggunakan tanda kutip tunggal untuk melampirkannya?

8

Jika saya menggunakan tanda kutip tunggal untuk melampirkan pernyataan tindakan awk, itu berfungsi seperti yang diharapkan:

$ 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

Tetapi jika saya menggunakan tanda kutip ganda untuk melampirkan mereka, ia mencetak seluruh baris bukannya kolom / bidang tertentu:

$ 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

Kenapa gitu? Mengapa menggunakan tanda kutip ganda untuk melampirkan pernyataan tindakan awk menghasilkan hasil yang berbeda daripada ketika menggunakan tanda kutip tunggal untuk melampirkannya? Bisakah saya melakukan sesuatu sehingga menyertakan menggunakan tanda kutip ganda berfungsi seperti melampirkan menggunakan tanda kutip tunggal?

Aditya
sumber
Coba gunakan tanda kutip tunggal di luar kurung kurawal.
Avinash Raj
@AvinashRaj Itu akan menghasilkan kesalahan sintaks, semua pernyataan tindakan awkharus berada di dalam { ... }.
Aditya
siapa bilang itu akan membuat kesalahan sintaksis? Sysntax awk akan seperti ini awk 'condition1{action1} condition2 {action2}',. Jika kita memberikan perintah awk seperti ini awk '{print $1}'berarti tidak ada syarat yang diberikan.
Avinash Raj
saya tidak mengatakan perintah Anda awk {'print $2'}salah. Saya katakan, akan lebih baik untuk menghindari tanda kutip tunggal di dalam kawat gigi, karena itu akan membingungkan Anda.
Avinash Raj
@AvinashRaj Oh .. Saya pikir Anda berarti sesuatu yang lain.
Aditya

Jawaban:

6

Jika Anda menggunakan tanda kutip ganda yang $2diganti oleh shell sebelum awkdipanggil. Seperti $2biasanya berjalan kosong

awk {"print $2"}

sama dengan berlari

awk {"print "}

Menggunakan

awk {"print \$2"}

jika Anda ingin menggunakan tanda kutip ganda.

Florian Diesch
sumber
Saya melihat manual seperti kapan ekspansi shell dilakukan . Itu tidak menyebutkan apa pun tentang tanda kutip tunggal atau ganda. Mengapa ekspansi tidak dilakukan jika ada tanda kutip tunggal? Dan, dari mana bash $2bisa diperluas? (Karena, saya mencoba mempelajari berbagai hal, saya ingin memahami apa yang sedang terjadi) :)
Aditya
Oh .. temukan ini yang menjelaskan perbedaan antara tanda kutip tunggal dan tanda kutip ganda. Itu sudah jelas .. Sekarang, dari mana bash mendapatkannya $2?
Aditya
Jika Anda bekerja pada baris perintah $2biasanya variabel lingkungan kosong
Florian Diesch
Oke, tidak tahu bahwa tidak perlu mendefinisikan variabel dalam bash. Jika bash tidak menemukan variabel, itu secara otomatis memperluasnya sebagai kosong. Jawaban ini pada Kesalahan Server membersihkannya.
Aditya