Perbedaan antara echo -e "<string>" dan echo $ "<string>"

20

Apa perbedaan antara menggunakan

echo -e "Hello\nWorld" 

dan

echo $"Hello\nWorld" 

bukankah keduanya menghasilkan:

Hello
World
Menandai
sumber
1
Apakah kamu sudah mencobanya? Output kedua Hello\nWorld. Anda memerlukan -esakelar untuk menafsirkan karakter pelarian.
becko
4
Untuk yang kedua, saya menduga Anda bermaksud menulisnya dengan tanda kutip tunggal echo $'Hello\nWorld',, yang akan dicetak pada dua baris di bawah bash.
John1024
@becko, ya saya mencobanya dan mereka berdua mengeluarkan hal yang persis sama.
Markus

Jawaban:

33

echo -edan echo $'...'keduanya serupa dalam hal mereka mendukung urutan pelarian berikut:

  \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)

Mereka memang memiliki perbedaan. Selain yang di atas, echo -emendukung:

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

Sebaliknya, $'....'mendukung:

 \'     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

Perhatikan bahwa, di antara keduanya, \cekstensi tidak kompatibel:

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

Untuk di echo -eatas, \cmenekan output lebih lanjut, dengan demikian mengabaikan Istop. Sebaliknya, untuk $'...', \cIditafsirkan sebagai tab.

Bentuk yang serupa secara visual: $"..."

Sebaliknya $'...', fungsinya $"..."sangat berbeda. Ini akan menyebabkan string yang dikandungnya diterjemahkan sesuai dengan lokal saat ini.

The echo -ekontroversi

echo -etidak didukung secara universal oleh cangkang dan banyak yang menganggap -eopsi ini sebagai kesalahan desain. Mengamati:

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

Seperti yang Anda lihat, jika apa yang Anda cetak echodimulai dengan tanda hubung, hasilnya bisa tidak terduga. Kecuali Anda yakin bahwa string pertama yang akan Anda cetak echotidak dimulai dengan tanda hubung, Anda kemungkinan besar akan lebih baik menggunakan printf.

Karena alasan ini, standar POSIX menyimpulkan :

Aplikasi baru dianjurkan untuk menggunakan printf daripada echo.

Chet Ramey, yang telah bertahan bashselama 22 tahun terakhir, setuju :

[N] kode baru harus menggunakan printf.

John1024
sumber
1
Juga perlu dicatat bahwa Chet dan POSIX merekomendasikan untuk menggunakan printfdaripadaecho
geirha
@geirha Poin yang sangat bagus. Jawaban diperbarui.
John1024
1
Masalah opsi yang tidak terduga dari gumpalan (seperti *) sebenarnya tidak khusus untuk echo. Itu terjadi dengan perintah apa pun yang mengenali opsi pendek atau panjang (ditulis dengan cara tradisional) dan mengambil nama file operan, termasukls . Bisa dibilang situasinya sedikit lebih buruk dengan echokarena (seperti sumber Anda sebutkan) echobiasanya tidak menerima --untuk menunjukkan akhir opsi, sedangkan orang dapat menulis perintah seperti ls -- *l. (Dan seseorang harus menulis perintah seperti itu, ketika menggunakan gumpalan yang dimulai dengan *atau -, terutama dalam skrip.)
Eliah Kagan
Terima kasih atas jawaban yang menyeluruh, saya memiliki excercise untuk saya Sistem Operasi saja dan saya perlu untuk mencetak beberapa teks menggunakan \nurutan escape, sehingga sebenarnya tidak masalah jika saya menggunakan echo -e '...', echo $'...'atauecho $"..."
Mark