Sự khác biệt giữa echo -e.1 <chuỗi> Hay và echo $ Biệt <chuỗi>


20

Sự khác biệt giữa việc sử dụng là gì

echo -e "Hello\nWorld" 

echo $"Hello\nWorld" 

không phải cả hai đầu ra:

Hello
World

1
Bạn đã thử à? Đầu ra thứ hai Hello\nWorld. Bạn cần -echuyển đổi để giải thích các ký tự thoát.
vẫy gọi

4
Đối với cái thứ hai, tôi nghi ngờ rằng bạn có nghĩa là viết nó với dấu ngoặc đơn echo $'Hello\nWorld', sẽ in ra trên hai dòng dưới bash.
John1024

@becko, vâng tôi đã thử nó và cả hai đều cho ra cùng một thứ chính xác.
Đánh dấu

Câu trả lời:


33

echo -eecho $'...'cả hai đều giống nhau ở chỗ chúng hỗ trợ các chuỗi thoát sau:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Họ có sự khác biệt. Ngoài các mục trên, echo -ehỗ trợ:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

Ngược lại, $'....'hỗ trợ:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

Quan sát rằng, giữa hai \cphần mở rộng không tương thích:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

Đối với echo -eở trên, \cngăn chặn đầu ra hơn nữa, do đó bỏ qua Istop. Ngược lại, cho $'...', \cIđược hiểu là một tab.

Các hình thức tương tự trực quan: $"..."

Ngược lại $'...', chức năng của $"..."khá khác nhau. Nó sẽ làm cho chuỗi nó chứa được dịch theo ngôn ngữ hiện tại.

Cuộc echo -etranh cãi

echo -ekhông được hỗ trợ phổ biến bởi shell và nhiều người coi -etùy chọn này là một lỗi thiết kế. Quan sát:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Như bạn có thể thấy, nếu những gì bạn đang in echobắt đầu bằng dấu gạch ngang, kết quả có thể bất ngờ. Trừ khi bạn chắc chắn rằng chuỗi đầu tiên mà bạn sẽ in echokhông bắt đầu bằng dấu gạch ngang, bạn có thể sử dụng tốt hơn printf.

Vì những lý do này, tiêu chuẩn POSIX kết luận :

Các ứng dụng mới được khuyến khích sử dụng printf thay vì echo.

Chet Ramey, người đã duy trì bashtrong 22 năm qua, đồng ý :

[N] mã ew nên sử dụng printf.


1
Cũng đáng lưu ý rằng cả ChetPOSIX đều khuyên bạn nên sử dụng printfthay vìecho
geirha

@geirha Điểm rất tốt. Trả lời cập nhật.
John1024

1
Vấn đề của các tùy chọn bất ngờ từ các khối (như *) không thực sự cụ thể echo. Nó xảy ra với bất kỳ lệnh nào nhận ra các tùy chọn ngắn hoặc dài (được viết theo cách truyền thống) và lấy các toán hạng tên tệp, bao gồmls . Có thể cho rằng tình hình tồi tệ hơn một chút echovì (như nguồn của bạn đề cập) echothường không chấp nhận --để chỉ ra sự kết thúc của các tùy chọn, trong khi người ta có thể viết các lệnh như thế nào ls -- *l. (Và thực sự người ta thường phải viết các lệnh theo cách đó, khi sử dụng các khối bắt đầu bằng *hoặc -, đặc biệt là trong các tập lệnh.)
Eliah Kagan

Cảm ơn bạn cho câu trả lời thấu đáo, tôi có một excercise cho hệ điều hành của tôi dĩ nhiên và tôi cần phải in ra một số văn bản bằng cách sử dụng \ndãy thoát, vì vậy trên thực tế nó không quan trọng nếu tôi sử dụng echo -e '...', echo $'...'hoặcecho $"..."
Đánh dấu
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.