เหตุใดการใช้เครื่องหมายคำพูดคู่เพื่อรวมคำสั่งการดำเนินการของ awk ให้ผลลัพธ์ที่แตกต่างกว่าเมื่อใช้เครื่องหมายคำพูดเดี่ยวเพื่อล้อมรอบข้อความเหล่านั้น


8

ถ้าฉันใช้อัญประกาศเดี่ยวเพื่อแนบคำสั่งการกระทำของ awk มันทำงานได้ตามที่คาดไว้:

$ 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

แต่ถ้าฉันใช้อัญประกาศล้อมรอบพวกเขามันจะพิมพ์ทั้งบรรทัดแทนที่จะเป็นคอลัมน์ / ฟิลด์เฉพาะ:

$ 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

ทำไมถึงเป็นเช่นนั้น? เหตุใดการใช้เครื่องหมายคำพูดคู่เพื่อรวมคำสั่งการกระทำของ awk ให้ผลลัพธ์ที่แตกต่างกว่าเมื่อใช้เครื่องหมายคำพูดเดี่ยวเพื่อล้อมรอบคำสั่งนั้น ฉันสามารถทำบางอย่างเพื่อให้การใช้เครื่องหมายคำพูดคู่ล้อมรอบเหมือนการใช้เครื่องหมายคำพูดเดี่ยวได้หรือไม่


ลองใช้คำพูดเดียวนอกวงเล็บปีกกา
Avinash Raj

@AvinashRaj ที่จะผลิตไวยากรณ์ผิดพลาดทั้งหมดงบดำเนินการในควรจะอยู่ในawk { ... }
Aditya

ใครบอกว่ามันจะสร้างข้อผิดพลาดทางไวยากรณ์? Awk sysntax จะเป็นอย่างนี้, awk 'condition1{action1} condition2 {action2}'. หากเราให้คำสั่ง awk เช่นนี้awk '{print $1}'หมายความว่าไม่มีการกำหนดเงื่อนไข
Avinash Raj

ฉันไม่ได้บอกว่าคำสั่งของคุณawk {'print $2'}ผิด ฉันพูดว่าจะเป็นการดีกว่าถ้าคุณหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยวในวงเล็บปีกกาเพราะมันจะทำให้คุณสับสน
Avinash Raj

@AvinashRaj โอ้ .. ฉันคิดว่าคุณหมายถึงอย่างอื่น
Aditya

คำตอบ:


6

หากคุณใช้เครื่องหมายคำพูดคู่$2จะได้รับการแทนที่ด้วยเชลล์ก่อนที่จะawkถูกเรียก ตาม$2ปกติแล้วจะเป็นการวิ่งที่ว่างเปล่า

awk {"print $2"}

เหมือนกับการวิ่ง

awk {"print "}

ใช้

awk {"print \$2"}

ถ้าคุณต้องการใช้เครื่องหมายคำพูดคู่


ฉันกำลังดูคู่มือต่าง ๆ ว่ามีการขยายเชลล์เมื่อใด มันไม่ได้พูดอะไรเลยเกี่ยวกับคำพูดเดียวหรือสองคำพูด เหตุใดจึงไม่มีการขยายในกรณีที่มีเครื่องหมายคำพูดเดี่ยว และทุบตีได้จากที่ไหน$2? (ตั้งแต่ฉันพยายามที่จะเรียนรู้สิ่งต่าง ๆ ฉันต้องการที่จะเข้าใจสิ่งที่เกิดขึ้น) :)
Aditya

โอ้ .. พบสิ่งนี้ซึ่งอธิบายความแตกต่างระหว่างคำพูดเดี่ยวและสองคำพูด ชัดเจนแล้ว .. ตอนนี้ทุบตีมาจากไหน$2?
Aditya

หากคุณกำลังทำงานกับบรรทัดคำสั่ง$2มักจะเป็นตัวแปรสภาพแวดล้อมที่ว่างเปล่า
Florian Diesch

ตกลงไม่ทราบว่าไม่จำเป็นต้องกำหนดตัวแปรใน bash ถ้า bash ไม่พบตัวแปรมันจะขยายออกโดยอัตโนมัติว่าว่างเปล่า คำตอบเกี่ยวกับความผิดพลาดของเซิร์ฟเวอร์จะล้างมันออก
Aditya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.