Tại sao sử dụng dấu ngoặc kép để gửi kèm theo tuyên bố hành động của awk tạo ra kết quả khác với khi sử dụng dấu ngoặc đơn để gửi chúng?


8

Nếu tôi sử dụng dấu ngoặc đơn để kèm theo tuyên bố hành động của awk, nó sẽ hoạt động như mong đợi:

$ 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

Nhưng nếu tôi sử dụng dấu ngoặc kép để đặt chúng, nó sẽ in toàn bộ dòng thay vì cột / trường cụ thể:

$ 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

Tại sao nó như vậy? Tại sao sử dụng dấu ngoặc kép để gửi kèm theo tuyên bố hành động của awk tạo ra kết quả khác với khi sử dụng dấu ngoặc đơn để gửi chúng? Tôi có thể làm một cái gì đó để kèm theo sử dụng dấu ngoặc kép hoạt động như bao quanh bằng dấu ngoặc đơn không?


Cố gắng sử dụng dấu ngoặc đơn bên ngoài dấu ngoặc nhọn.
Avinash Raj

@AvinashRaj Điều đó sẽ tạo ra lỗi cú pháp, tất cả các câu lệnh hành động awkphải nằm trong { ... }.
Aditya

Ai nói nó sẽ tạo ra lỗi cú pháp? Awk sysntax sẽ như thế này awk 'condition1{action1} condition2 {action2}'. Nếu chúng ta đưa ra lệnh awk như thế này awk '{print $1}'có nghĩa là không có điều kiện nào được đưa ra.
Avinash Raj

Tôi không nói lệnh của bạn awk {'print $2'}là sai. Tôi đã nói, sẽ tốt hơn nếu tránh các trích dẫn đơn trong niềng răng, bởi vì nó sẽ làm bạn bối rối.
Avinash Raj

@AvinashRaj Oh .. Tôi nghĩ bạn có ý gì khác.
Aditya

Câu trả lời:


6

Nếu bạn sử dụng dấu ngoặc kép, phần $2được thay thế bằng shell trước awkđược gọi. Như $2thường là chạy trống

awk {"print $2"}

giống như chạy

awk {"print "}

Sử dụng

awk {"print \$2"}

nếu bạn muốn sử dụng dấu ngoặc kép.


Tôi đang xem hướng dẫn sử dụng như khi mở rộng vỏ được thực hiện . Nó không đề cập bất cứ điều gì về dấu ngoặc đơn hoặc dấu ngoặc kép. Tại sao việc mở rộng không được thực hiện trong trường hợp dấu ngoặc đơn? Và, bash $2được mở rộng từ đâu? (Vì, tôi đang cố gắng học hỏi mọi thứ, tôi muốn hiểu chuyện gì đang xảy ra) :)
Aditya

Oh .. tìm thấy điều này giải thích sự khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép. Điều đó rõ ràng .. Bây giờ, bash lấy từ $2đâu?
Aditya

Nếu bạn đang làm việc trên dòng lệnh $2thường là một biến môi trường trống
Florian Diesch

Được rồi, không biết rằng không cần thiết phải xác định một biến trong bash. Nếu bash không tìm thấy một biến, nó sẽ tự động mở rộng nó thành trống. Câu trả lời này trên Server Fault sẽ xóa nó.
Aditya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.