Jika saya memiliki string dengan karakter yang tidak dapat echo
dicetak , baris baru, atau tab, apakah ada cara yang dapat saya gunakan untuk mencetak string ini dan menampilkan kode untuk karakter ini (misalnya, \n
untuk baris baru, \b
untuk backspace)?
13
e- ohce
* rimshot *printf '%q' "$str"
akan mencetak string lolos. Saya tidak menambahkan ini sebagai jawaban karena itu bukan bentuk melarikan diri yang sama yangecho -e
menggunakan - lebih tepatnya, itu dimaksudkan untuk aman dari kesalahan - tetapi (1) itu cukup baik jika tujuan Anda adalah keterbacaan manusia, (2) itu cukup bagus jika sasaran Anda adalah menghasilkan shell yang aman, dan (3)echo -e
bagaimanapun juga Jahat Dan Salah (jika Anda membaca spesifikasi POSIX, Anda akan melihat bahwa printf adalah cara yang disukai untuk melakukan pemformatan string, danecho -e
tidak dijamin oleh POSIX dasar di semua).Jawaban:
Ada banyak cara untuk melakukan ini. Dua yang paling portabel yang saya tahu adalah
sed
danod
- keduanya POSIX.Itu seperti ...
read
style escape - C-style.KELUARAN
od
sedikit lebih dapat dikonfigurasi ...Jika Anda ingin tahu apa semua opsi yang Anda bisa lihat
man od
, tapi saya tentukan saya ingin dua jenis lolos --t c
backslash lolos dan-t a
karakter yang disebutkan. The-w
pilihan yang digunakan di atas tidak POSIX-ditentukan.Dan inilah fungsi shell kecil yang akan mencetak nilai oktal setiap byte dalam portablenya - yang tentu saja
od
dapat menangani-t o
:Itu yang sederhana. Ini sedikit lebih rumit. Seharusnya bisa melakukan apa yang bisa dilakukan oleh
printf -q
implementasi spesifik shell .Menggunakan contoh string dari sebelumnya dengan sedikit tambahan:
KELUARAN
Hanya sedikit berbeda. Anda mungkin memperhatikan ada tambahan
0
dan tambahan\b
ackslash. Ini untuk memungkinkan terjemahan yang mudah ke suaturead
atau%b
printf
argumen. Sebagai contoh:KELUARAN
sumber
proctal
?bsq()
- apakah ada yang hilang? Saya bertanya karena saya tidak sepenuhnya yakin tentang backslash.Ketika Anda menghapus
-e
sakelar keecho
, dibash
, dan asalkanxpg_echo
opsi belum diaktifkan, itu harus mencetak string sebagai tidak lebih dari teks aslinya. Jadi\n
dan\t
akan muncul secara harfiah.Contoh
Anda juga dapat menggunakan
printf
perintah bawaanksh93
,zsh
ataubash
untuk menyelesaikan ini juga.(
kutipan daribash
output ditunjukkan di atas. Ada beberapa variasi tergantung pada shell).help printf
dalambash
sumber
printf %q
yang memotong trailing\n
, melainkan$()
tangkapan keluaran yang menghapusnya.printf
di dalam subkulit untuk menangkap outputnya adalah konyol, karenaprintf -v varname
akan menempatkan output secara langsung ke dalam variabel, tidak ada subkulit yang terlibat.printf
dalam subkulit, saya berjalanecho
dalam satu, murni untuk menunjukkan bahwa Anda dapat mengambil output karakter khusus dariecho
dan mengubahnya kembali ke notasi yang lolos.Anda bisa menggunakan sesuatu seperti,
Sekarang, Anda bisa melakukan sesuatu seperti,
Keluaran
Pengujian umum lainnya tanpa file adalah,
Perintah di atas menghasilkan output sebagai,
Referensi
sumber
Dengan
zsh
, ada(q)
,(qq)
,(qqq)
,(qqqq)
bendera ekspansi variabel yang dapat mengutip variabel dalam berbagai cara:Dalam kasus Anda, Anda mungkin menginginkan salah satu dari dua yang terakhir.
sumber
od -c
akan mencetak karakter normal secara normal, tetapi karakter khusus (tab, baris baru, dll.) dan karakter yang tidak patut dicetak sebagaiprintf
kode pelarian mereka .Begitu:
The
-An
memberitahuod
tidak keluaran alamat.sumber
Gunakan
printf
perintah. Sebagai contoh:printf "Hello\nthis is my line
akan menampilkan
sumber
echo -e
, saya mencari yang sebaliknya .