Dấu gạch chéo ngược được xử lý đặc biệt bằng cách echo -e
, nhưng trước tiên, đôi khi chúng được xử lý đặc biệt bằng vỏ (trong trường hợp này là bash
), theo quy tắc trích dẫn của vỏ .
Đối số echo
thực sự nhìn thấy là Hello\\n
. Bởi vì bạn đã trôi qua -e
đến echo
, nó xử lý thoát xuyệc ngược đặc biệt, và \\
được thu nhỏ đến một single \
. Trận chung kết n
không được thoát, vì vậy nó xuất hiện theo nghĩa đen.
Lý do cho điều này là, trước và tách biệt với hoạt động của echo
chính nó, vỏ xử lý \
đặc biệt trong một số bối cảnh nhưng không phải là khác. Các \
ký tự không được trích dẫn luôn được xử lý đặc biệt, trích dẫn\
đơn không bao giờ được xử lý đặc biệt, nhưng việc xử lý các ký tự được trích dẫn kép \
, như trong lệnh bạn đã chạy, tinh tế và phức tạp hơn.
Khi shell gặp văn bản trích dẫn kép trong một lệnh, như với "Hello\\\n"
, nó xử lý \
như một ký tự thoát khi nó đứng trước một ký tự có thể có ý nghĩa đặc biệt bên trong dấu ngoặc kép chứ không phải khác .
- Bởi vì
\
đôi khi có một ý nghĩa đặc biệt bên trong ""
, một \
cái ngay trước một cái khác \
có tác dụng trích dẫn thứ hai đó \
. Vì vậy, bên trong dấu ngoặc kép, đầu tiên \\
được thu gọn vào \
.
- Sau hai
\
ký tự đầu tiên đó, có một \
ký tự thứ ba không bị ảnh hưởng bởi hai ký tự đầu tiên và trước một ký tự n
. Nhưng n
không phải là một nhân vật được đối xử đặc biệt trong dấu ngoặc kép, vì vậy \
trước đó nó không được đối xử đặc biệt trong tình huống này. Do đó \n
ở lại \n
.
Hiệu quả là, trong dấu ngoặc kép, \\\n
được hiểu là \\n
.
Khi echo -e
nhìn thấy \\n
, cái đầu tiên \
loại bỏ ý nghĩa đặc biệt từ cái thứ hai, vì vậy hãy echo
in theo \n
nghĩa đen cho văn bản đó.
Nếu mục tiêu của bạn là in Hello
thêm một dòng mới nhưng không có dấu gạch chéo ngược (câu hỏi ban đầu không rõ ràng về điều này, cộng với tôi nghĩ đó là một ví dụ hữu ích), thì một giải pháp là loại bỏ a \
. Chạy echo -e "Hello\\n"
đầu ra Hello
với một dòng mới bổ sung vào cuối.
Một giải pháp tốt hơn là sử dụng dấu ngoặc đơn và viết echo -e 'Hello\n'
. Trích dẫn duy nhất là hình thức mạnh nhất của trích dẫn. Một giải pháp thậm chí tốt hơn thường là sử dụng printf
thay vì echo
, trong trường hợp này sẽ là printf 'Hello\n\n'
.
Nếu mục tiêu của bạn là in Hello\
bao gồm dấu gạch chéo ngược, theo sau là một dòng mới , thì cách tiếp cận được trích dẫn kép là có thể nhưng rườm rà. Để tìm ra nó, hãy làm việc ngược lại: echo -e
chuyển đổi \\
sang \
và \n
thành một dòng mới, và trích dẫn hai lần chuyển đổi \\
thành \
, do đó bạn có thể thực hiện với sáu dấu gạch chéo ngược ( echo -e "Hello\\\\\\n"
), vì \\n
biến thành \n
một dấu gạch chéo ngược thoát khỏi dấu gạch chéo khác. Bạn cũng có thể làm điều đó với năm, vì trích dẫn kép giữ lại \n
khi \
không thoát.
Điều này minh họa lợi ích của trích dẫn đơn: chỉ cần đặt bất cứ điều gì bạn muốn echo -e
thấy bên trong dấu ngoặc đơn ( echo -e 'Hello\\\n'
). printf
ở đây cũng tốt Một lựa chọn là printf 'Hello\\\n\n'
. Nhưng nơi printf
thực sự tỏa sáng là bạn có thể cắm thêm các đối số. Bạn có thể sử dụng printf '%s\n\n' 'Hello\'
, trong đó chèn đối số thứ hai (theo nghĩa đen Hello\
bởi vì các trích dẫn đơn lẻ không thay đổi bất cứ điều gì) thay cho %s
.