Làm thế nào để bạn thoát khỏi dấu nháy đơn trong chuỗi trích dẫn trong bash?


17

Tôi không hiểu làm thế nào bash đánh giá việc thoát các ký tự dấu nháy đơn trong các chuỗi trích dẫn.

Đây là một ví dụ:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input

Tôi đã cố gắng tìm kiếm lời giải thích cho điều này nhưng không thể nhận được bất cứ điều gì. Bash đang làm gì ở đây?


echo \''Hello World'\'
toán

Câu trả lời:


18

Trong dấu ngoặc đơn, không có lối thoát là có thể. Không có cách nào để bao gồm một trích dẫn thành một trích dẫn. Xem trích dẫn trong bash người đàn ông .


1
Bạn đúng. Thủ thuật nằm ở dòng đó 'Một trích dẫn có thể không xảy ra các trích dẫn đơn lẻ ngay cả khi đi trước dấu gạch chéo ngược' Vì vậy, nó có thể chia nó thành các phần khác nhau.
Kibet

@Colin Ngay sau khi một trích dẫn nằm trong hai trích dẫn đơn khác (nhưng bị gạch chéo lại), trích dẫn được trích dẫn không còn là một trích dẫn thực sự nữa. Nó chỉ là một char không có đặc điểm ghép đôi đặc biệt.
zero2cx

1
@ zero2cx: Không đúng:echo '\''
choroba

@ zero2cx: Tôi sẽ nói "bên ngoài" thay vì "bên trong".
choroba

3
@choroba không "hoàn toàn" đúng, trong bash bạn có thể làmecho $'\'hello world\''
bufh 17/12/14

8

Ngoài trích dẫn đơn và kép được hỗ trợ bởi POSIX, bashcung cấp một loại trích dẫn bổ sung để cho phép một lớp nhỏ các ký tự thoát (bao gồm một trích dẫn) trong một chuỗi trích dẫn:

$ echo $'\'Hello World\''
'Hello World'

Xem phần QUOTING trong bashtrang man, gần cuối phần. (Tìm kiếm "ANSI C".)


3

Để giải thích những gì đang xảy ra với dấu nháy đơn đã thoát của bạn, chúng tôi sẽ kiểm tra ví dụ thứ hai của bạn (cũng xem các trích dẫn đơn hoặc trích dẫn mạnh ):

$ echo '\'Hello World\''
>     # expects you to continue input

Ở đây, bạn đã để lại báo giá treo, như bạn đã nêu. Bây giờ cắt kết thúc và thay đổi nó thành:

                     v                                v           v
$ echo '\'Hello World     # Echo two strings: '\' and 'Hello World'.
\Hello World         ^

Chuỗi con "Hello World" không được trích dẫn ở đây, nhưng nó hoạt động như thể nó được trích dẫn mạnh mẽ. Sử dụng ví dụ của bạn một lần nữa, cắt kết thúc khác nhau lần này:

                     vv                                    v (plain apostrophe)
$ echo '\'Hello World\'   # Will echo: '\' and 'Hello World''
\Hello World'        ^^   # Note that the trailing ' char is backslash escaped. 

Chuỗi con "Hello World" một lần nữa hoạt động như thể nó được trích dẫn mạnh mẽ, chỉ có dấu nháy đơn được thêm vào (thoát, do đó không còn một trích dẫn nào) ở cuối.

Khi một trích dẫn khác được thêm vào cuối (ví dụ ban đầu của bạn), chuỗi sẽ bị treo và chờ đợi một trích dẫn gần.


3

Ví dụ đơn giản về thoát dấu ngoặc kép trong shell:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

Nó được thực hiện bằng cách đóng đã mở một ( '), đặt thoát một ( \') để in, sau đó mở một ( ') khác.

Cách khác:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

Nó được thực hiện bằng cách hoàn thành đã mở một ( '), đặt trích dẫn trong một trích dẫn khác ( "'"), sau đó mở một ( ') khác.

Những gì bạn đã làm ( '\'Hello World\''), là:

  1. Đã mở dấu nháy đơn thứ 1 : '.
  2. Đóng ngay sau nó \', vì vậy chuỗi trở thành : '\'.
  3. Hello World không phải là trích dẫn.
  4. Đặt dấu nháy đơn độc lập ( \') mà không mở nó.
  5. Dấu nháy đơn cuối cùng ( ') đang mở chuỗi, nhưng không có kết thúc nào được mong đợi.

Vì vậy, ví dụ chính xác sẽ là:

$ echo \'Hello World\'
'Hello World'

Liên quan: Làm thế nào để thoát dấu ngoặc đơn trong chuỗi trích dẫn đơn?

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.