2013-02-21 43 views

Trả lời

15

Bạn đang nhận được bối rối bằng cách trích dẫn vỏ. Khi bạn gõ:

ack "\\\$\\\$\(" 

vỏ nội suy chuỗi trích dẫn kép để \\ được phiên dịch sang \, \$ được phiên dịch sang $\( được phiên dịch sang \( và ack được chuỗi \$\$\( như là đối số của nó. Nó là đơn giản hơn nhiều để tránh những suy vỏ bằng cách sử dụng dấu nháy đơn và gọi:

ack '\$\$\(' 

Thay ack với echo để khám phá cách vỏ được mở rộng chuỗi. Lưu ý rằng

ack "\\$\\$\(" 

cũng sẽ hoạt động, nhưng vì các lý do hơi khác nhau. Ở đây, hai chữ cái đầu tiên \ được coi là một đơn (thoát) \, thì $ được dịch là $ vì nó được theo sau bởi một ký tự không phải là ký tự hợp lệ trong tên biến. \( mở rộng thành \( thay vì chỉ đơn giản là (( không bị nội suy và do đó không cần phải thoát. Nhưng lưu ý rằng bên ngoài dấu ngoặc kép, \( được chuyển đổi thành (.

Quy tắc trích dẫn của đôi khi đôi khi gây nhầm lẫn!

+1

vâng tôi bị lẫn lộn bởi quy tắc trích dẫn dễ dàng - mẹo lừa là một ý tưởng tuyệt vời mặc dù, nhờ chia sẻ –

0

Bạn có thể thoát khỏi nhân vật ký hiệu đô la với ba gạch chéo ngược, như thế này:

ack "\\\$\\\$" 

hoặc sử dụng dấu nháy đơn, nơi bạn chỉ phải thoát khỏi nó một lần:

ack '\$\$' 
+3

Dễ dàng hơn khi sử dụng dấu nháy đơn: 'ack '\ $ \ $ \ ('' nên hoạt động tốt. –

+0

Yup, tốt hơn nhiều - cảm ơn! –

0

Bạn có thể sử dụng printf để xử lý báo giá cho bạn bằng cách sử dụng định dạng số %q.

$ printf %q '$$(' 
\$\$\(

help print có (bash Tôi giả định ở đây) sau đây để nói `

%q quote the argument in a way that can be reused as shell input 
15

Sử dụng ack của -Q để làm thoát của bạn.

ack -Q '$$' 
+0

Tuyệt vời, cảm ơn! – blushrt

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