Sự khác biệt giữa trích dẫn đơn $ 'chuỗi' và trích dẫn kép $ chuỗi chuỗi trong bash là gì?


9

Tôi đã cố gắng thực hiện dòng mới bằng cách sử dụng echovà thử theo hai lệnh:

  1. Lệnh đầu tiên:

    echo $'Hello World\nThis is a new line'

    Phản ứng:

    Hello World
    This is a new line
  2. Lệnh thứ hai:

    echo $"Hello World\nThis is a new line"

    Phản ứng:

    Hello World\nThis is a new line

Câu hỏi của tôi là sự khác biệt giữa chuỗi được bao bọc bởi những gì $' 'vs chuỗi được bao bọc bởi $" "trong bash's echo?


Lưu ý hữu ích: Trích dẫn kép còn được gọi là trích dẫn yếu và trích dẫn đơn còn được gọi là trích dẫn mạnh.
Rafaf Tahsin ngày 18/8/2016

2
Có, nhưng "weak quote"'strong quote'khác với $'C String'$"I18N String".
DopeGhoti

Bạn là MVP thực sự. : D >>> @DopeGhoti
Rafaf Tahsin ngày 18/8/2016

Tôi làm những gì tôi có thể (:
DopeGhoti

Câu trả lời:


10

Như được giải thích ở đây , cú pháp $'string'chỉ định một chuỗi kiểu C bao gồm các ký tự thoát ma thuật, chẳng hạn như \ncho một dòng mới. $"string"là để mở rộng I18N, không có phép thuật thoát như vậy.

Lưu ý rằng đây là những khác biệt với phổ biến hơn "string"(trích dẫn yếu) và 'string'(trích dẫn mạnh mẽ).


9

Phần $đầu của chuỗi trong:

echo $'Hello World\nThis is a new line'

gây ra các chuỗi thoát được giải thích.

Hướng dẫn tham khảo Bash [nói]

Các từ có dạng $ 'chuỗi' được xử lý đặc biệt. Từ này mở rộng thành chuỗi, với các ký tự thoát dấu gạch chéo ngược được thay thế theo quy định của tiêu chuẩn ANSI C. ..
..
Kết quả mở rộng được trích dẫn một lần, như thể ký hiệu đô la không có mặt.

Nhưng

echo $"Hello World\nThis is a new line"

là hoàn toàn khác nhau. Đây [bài viết] trên miền địa phương cụ dịch nói:

Một chuỗi trích dẫn kép có trước ký hiệu đô la ('$') sẽ khiến chuỗi được dịch theo ngôn ngữ hiện tại. Nếu miền địa phương hiện tại là C hoặc POSIX, ký hiệu đô la sẽ bị bỏ qua. Nếu chuỗi được dịch và thay thế, thay thế được trích dẫn kép.


Lưu ý: IIRC cả $'string'$"string"có thể không tìm thấy sự hỗ trợ giữa các hệ vỏ khác nhau. Không chỉ những người từ các hệ vỏ khác nhìn vào họ với sự tò mò mà còn tranh luận về việc liệu điều này có thể tránh được đối với tính di động của tập lệnh hay không.


1
ksh93cũng hiểu $'...'.
Kusalananda

@Kusalananda: Hmm, ghi chú tốt :)
sjsam

4
$'xxx'không phải là một bashism nhưng lần đầu tiên được giới thiệu bởi kshmột vài năm trước bashđó. Nó hiện đang cũng được hỗ trợ bởi zshbusybox shvà đang được xem xét bởi các tiêu chuẩn POSIX.
jlliagre

@jlliagre: Đánh giá cao thời gian :). Tôi đứng chính xác ..
sjsam
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.