Saya tidak tahu tentang printf, dengan printf berfungsi: P ... lalu apa fungsinya jika tidak bekerja dengan gema?
Saeid Yazdani
Apakah \rtermasuk dalam output atau itu bagian dari CRLFbaris baru?
cuonglm
9
Ada banyak implementasi echoperintah yang berbeda yang tidak kompatibel satu sama lain. Oleh karena itu disarankan untuk menggunakan alat yang lebih standar printf. Lihat unix.stackexchange.com/questions/65803/… untuk tinjauan umum masalah yang lebih luas.
String yang akan ditulis ke output standar. Jika operan pertama adalah -n, atau jika salah satu operan berisi karakter < \backslash> , hasilnya ditentukan-implementasi .
Pada sistem konforman XSI , jika operan pertama -n, itu harus diperlakukan sebagai string, bukan opsi . Urutan karakter berikut harus diakui pada sistem yang sesuai dengan XSI dalam salah satu argumen:
\a- Tulis <alert> .
\b- Tulis <backspasi> .
\c- Menekan <newline> yang jika tidak mengikuti argumen terakhir di output. Semua karakter yang mengikuti \cargumen akan diabaikan.
\f- Tulis <form-feed> .
\n- Tulis <newline> .
\r- Tulis <carriage-return> .
\t- Tulis <tab> .
\v- Tuliskan <vertical-tab> .
\\- Tulis karakter <backslash> .
\0num- Tulis nilai 8-bit yang merupakan angka oktal nol, satu, dua, atau tiga digit num.
Jadi sebenarnya tidak ada cara umum untuk mengetahui cara menulis baris baru echo, kecuali bahwa Anda biasanya dapat mengandalkan melakukannya echo.
Sebuah bashshell biasanya tidak tidak sesuai dengan spesifikasi, dan menangani -ndan pilihan lain, tapi bahkan yang tidak pasti. Anda dapat melakukan:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Dan bahkan itu tidak perlu jika bashtelah dibangun dengan opsi waktu bangun ...
Jadikan echobawaan mengembangkan karakter backslash-escaped secara default, tanpa memerlukan -eopsi. Ini menetapkan nilai default dari xpg_echoopsi shell on, yang membuat Bash echoberperilaku lebih seperti versi yang ditentukan dalam Spesifikasi Unix Tunggal, versi 3. Lihat Bash Builtins , untuk deskripsi tentang urutan melarikan diri yang echomengenali.
printf
Di sisi lain, printfperilaku cukup jinak dibandingkan.
The printfutilitas ditambahkan untuk menyediakan fungsionalitas yang secara historis telah disediakan oleh echo. Namun, karena perbedaan yang tak dapat didamaikan dalam berbagai versi yang echomasih ada, versi ini memiliki beberapa fitur khusus, meninggalkan mereka ke printfutilitas baru ini , yang didasarkan pada satu di sistem Edisi Kesembilan.
Bagian DIPERLUASKAN DESKRIPSI hampir sama persis dengan printf()fungsi dalam standar ISO C, meskipun dijelaskan dalam hal notasi format file dalam Notasi Format File XBD .
Ini menangani format string yang menggambarkan argumennya - yang bisa berupa banyak hal, tetapi untuk string cukup banyak baik %bstring yte atau %string literal . Selain dari %formats di argumen pertama, itu berperilaku paling seperti %bargumen string yte, kecuali bahwa itu tidak menangani jalan \ckeluar.
Opsi "-e" sederhana yang bagus untuk membuat urutan pelarian berfungsi - ia mengatakan pada jawaban lain yang echotidak dapat diandalkan dan tidak mengikuti standar yang tidak sama printf.
Edward
1
Pastikan skrip Anda tidak mengandung literal \ r \ n, seperti dalam sebuah tr -d "\n"perintah.
Noumenon
8
Di semua versi bash yang saya gunakan, Anda bisa memasukkan baris baru literal ke string baik secara interaktif maupun dalam skrip, asalkan string tersebut cukup dikutip.
echo
wajib? Anda dapat menggunakanprintf
.\r
termasuk dalam output atau itu bagian dariCRLF
baris baru?echo
perintah yang berbeda yang tidak kompatibel satu sama lain. Oleh karena itu disarankan untuk menggunakan alat yang lebih standarprintf
. Lihat unix.stackexchange.com/questions/65803/… untuk tinjauan umum masalah yang lebih luas.Jawaban:
echo
Sebuah
echo
implementasi yang ketat sesuai dengan Single Unix Specification akan menambahkan baris baru jika Anda lakukan:Tapi itu bukan perilaku yang bisa diandalkan. Sebenarnya, sebenarnya tidak ada perilaku standar yang dapat Anda harapkan
echo
.Jadi sebenarnya tidak ada cara umum untuk mengetahui cara menulis baris baru
echo
, kecuali bahwa Anda biasanya dapat mengandalkan melakukannyaecho
.Sebuah
bash
shell biasanya tidak tidak sesuai dengan spesifikasi, dan menangani-n
dan pilihan lain, tapi bahkan yang tidak pasti. Anda dapat melakukan:Dan bahkan itu tidak perlu jika
bash
telah dibangun dengan opsi waktu bangun ...printf
Di sisi lain,
printf
perilaku cukup jinak dibandingkan.Ini menangani format string yang menggambarkan argumennya - yang bisa berupa banyak hal, tetapi untuk string cukup banyak baik
%b
string yte atau%s
tring literal . Selain dari%f
ormats di argumen pertama, itu berperilaku paling seperti%b
argumen string yte, kecuali bahwa itu tidak menangani jalan\c
keluar.Lihat Mengapa
printf
lebih baik daripadaecho
? untuk lebih.echo() printf
Anda dapat menulis sesuai standar Anda sendiri
echo
seperti ...... yang seharusnya selalu melakukan hal yang benar secara otomatis.
Sebenarnya, tidak ... Itu mencetak literal
\n
di bagian akhir argumen jika argumen terakhir berakhir dengan jumlah ganjil <backslashes> .Tetapi ini tidak:
sumber
shopt -s xpg_echo
opsi dalamecho
untuk digunakan-e
secara default.-e
. Saya terkejut bahwa tidak ada yang memperhatikan bahwa kecuali mungkin @HaydeSchiffLewati tanda -e ke echo untuk mengurai karakter yang lolos seperti "\ r \ n", seperti:
sumber
echo
tidak dapat diandalkan dan tidak mengikuti standar yang tidak samaprintf
.tr -d "\n"
perintah.Di semua versi bash yang saya gunakan, Anda bisa memasukkan baris baru literal ke string baik secara interaktif maupun dalam skrip, asalkan string tersebut cukup dikutip.
Secara interaktif:
Dalam naskah:
sumber
kemungkinan penggunaan lebih lanjut:
sumber
Orang-orang sudah menjawab dengan cukup, tetapi saya menolak untuk menerima dunia di mana gema menerima pilihan selain
-n
.sumber
Jika Anda memiliki karakter yang bukan bagian dari pesan, Anda dapat menyalurkan melalui sed
sumber