Điều đó có nghĩa gì khi có một chuỗi tiền tố $ đô la đô la trong tập lệnh?


81

Tôi chỉ thấy điều này trong một kịch bản init:

echo $"Stopping Apache"

Ký hiệu đô la đó để làm gì?

Nghiên cứu của tôi cho đến nay:

Tôi tìm thấy điều này trong hướng dẫn bash:

trích xuất

Nếu được đặt $'string'$"string"trích dẫn được thực hiện trong phạm vi ${parameter}mở rộng kèm theo dấu ngoặc kép. Tùy chọn này được kích hoạt theo mặc định.

... nhưng tôi không tìm thấy bất kỳ sự khác biệt nào giữa các chuỗi có và không có $tiền tố:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD

Câu trả lời:


111

Có hai điều khác nhau đang diễn ra ở đây, cả hai đều được ghi lại trong bashhướng dẫn

$ '

Báo giá đơn ký hiệu đô la là một hình thức trích dẫn đặc biệt:

Trích dẫn ANSI C

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.

$ "

Báo giá kép ký hiệu đô la là để nội địa hóa:

Bản dịch địa phương

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.


22

Khi một chuỗi được mở rộng bên trong $'', các chuỗi thoát được diễn giải. Từ trang hướng dẫn:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

Một ví dụ dễ hiểu là chuỗi thoát \ n cho một dòng mới:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

Lưu ý: Bạn có thể nhận được các kết quả khác nhau trong các shell khác vì echocó thể diễn giải các chuỗi thoát mà không cung cấp tùy chọn.


8
Không có đề cập đến $"...", theo câu hỏi.
Peter.O

-4

Bạn đang hiểu sai hướng dẫn. Bạn sẽ chỉ thấy một hiệu ứng khi một chuỗi ký tự $ nằm trong một bản ${parameter}mở rộng.

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

Nguồn và đọc thêm: https://lists.gnu.org/archive/html/orms-bash/2005-10/msg00017.html


6
Điều này không trả lời câu hỏi: $"…"là một cái gì đó khác nhau.
Gilles

4
Xin lỗi, nhưng câu trả lời của bạn là sai: không cần sử dụng ${}mở rộng để sử dụng trích dẫn ANSI. Tự kiểm tra:echo $'ab\ncd'
rozcietrzewiacz

1
Tôi nghĩ rằng câu trả lời này đã cố gắng giải thích extquotekhông chính xác thay vì những gì câu hỏi đang hỏi.
jw013

1
"${...}"khác với$"..."
GypsyCosmonaut
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.