2013-08-20 14 views
6

Tôi muốn sử dụng awk trong bashscript của tôi, và dòng này rõ ràng không hoạt động:thoát đôla trong bashscript (trong đó sử dụng awk)

line="foo bar" 
echo $line | awk '{print $1}' 

Làm thế nào để thoát khỏi $1, vì vậy nó không có được thay thế bằng đối số đầu tiên của tập lệnh?

+8

Nó sẽ không được thay thế. Nó sẽ là từ đầu tiên trong '" $ line "' – user000001

+1

Mục đích của những dấu nháy đơn xung quanh chương trình "awk'" là đảm bảo rằng bash sẽ không cố gắng thực hiện bất kỳ tham số nào, vì vậy tập lệnh của bạn sẽ hoạt động như kỳ vọng. –

+1

@CostiCiudatu từ được mở rộng – SheetJS

Trả lời

8

Kịch bản của bạn (với dấu nháy đơn xung quanh kịch bản awk) sẽ làm việc như mong đợi:

$ cat script-single 
#!/bin/bash 
line="foo bar" 
echo $line | awk '{print $1}' 

$ ./script-single test 
foo 

Sau đây, tuy nhiên, sẽ nghỉ (kịch bản sẽ ra một dòng trống):

$ cat script-double 
#!/bin/bash 
line="foo bar" 
echo $line | awk "{print $1}" 

$ ./script-double test 
​ 

Lưu ý các dấu ngoặc kép xung quanh chương trình awk.

Bởi vì dấu ngoặc kép mở rộng biến $1, lệnh awk sẽ nhận được tập lệnh {print test}, in nội dung của biến awk test (trống). Dưới đây là một kịch bản cho thấy rằng:

$ cat script-var 
#!/bin/bash 
line="foo bar" 
echo $line | awk -v test=baz "{print $1}" 

$ ./script-var test 
baz 

đọc liên quan: Bash Reference Manual - QuotingShell Expansions

+1

+1 cho * figuring * e ngại trong câu hỏi. – devnull

+0

@cmbuckley cách thoát khỏi ký hiệu đô la khi bên trong là: ''{print" $ line, "$ 1}'' – tachomi

4

Như hiện bằng văn bản, $ 1 sẽ không được thay thế (vì nó trong đơn trích dẫn chuỗi, bash sẽ không phân tích nó)

Nếu bạn viết awk "{print $1}", bash sẽ mở rộng $1 trong chuỗi dụng dấu ngoặc kép

Lưu ý rằng các quy tắc mở rộng biến phụ thuộc vào l ngoài cùng evel trích dẫn, do đó, $1 trong "awk '{print $1}'" sẽ được mở rộng

Các vấn đề liên quan