Apa perbedaan antara menggunakan
echo -e "Hello\nWorld"
dan
echo $"Hello\nWorld"
bukankah keduanya menghasilkan:
Hello
World
echo $'Hello\nWorld'
,, yang akan dicetak pada dua baris di bawah bash.
Apa perbedaan antara menggunakan
echo -e "Hello\nWorld"
dan
echo $"Hello\nWorld"
bukankah keduanya menghasilkan:
Hello
World
echo $'Hello\nWorld'
,, yang akan dicetak pada dua baris di bawah bash.
Jawaban:
echo -e
dan 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 -e
mendukung:
\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, \c
ekstensi tidak kompatibel:
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
Untuk di echo -e
atas, \c
menekan output lebih lanjut, dengan demikian mengabaikan Istop
. Sebaliknya, untuk $'...'
, \cI
ditafsirkan sebagai tab.
$"..."
Sebaliknya $'...'
, fungsinya $"..."
sangat berbeda. Ini akan menyebabkan string yang dikandungnya diterjemahkan sesuai dengan lokal saat ini.
echo -e
kontroversiecho -e
tidak didukung secara universal oleh cangkang dan banyak yang menganggap -e
opsi ini sebagai kesalahan desain. Mengamati:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
Seperti yang Anda lihat, jika apa yang Anda cetak echo
dimulai dengan tanda hubung, hasilnya bisa tidak terduga. Kecuali Anda yakin bahwa string pertama yang akan Anda cetak echo
tidak 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 bash
selama 22 tahun terakhir, setuju :
[N] kode baru harus menggunakan printf.
*
) 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 echo
karena (seperti sumber Anda sebutkan) echo
biasanya 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.)
\n
urutan escape, sehingga sebenarnya tidak masalah jika saya menggunakan echo -e '...'
, echo $'...'
atauecho $"..."
Hello\nWorld
. Anda memerlukan-e
sakelar untuk menafsirkan karakter pelarian.