Jawaban:
echo -e ' \t '
akan menampilkan 'spasi ruang baris baru' ( -eberarti 'aktifkan interpretasi backslash lolos'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -etidak berhasil dari Makefiles?
echo -ebukan POSIX dan makepanggilan /bin/shyang biasanya bukan penggunaan program gunakan secara interaktif, dan biasanya belum -ediimplementasikan. Untuk portabilitas, gunakan printf '\t'saja.
manhalaman untuk echoperintah tidak menyebutkan opsi -e. Namun, opsi ini diterima.
Gunakan printf, bukan echo.
Ada beberapa versi echoperintah yang berbeda. Ada /bin/echo(yang mungkin atau mungkin bukan versi GNU Coreutils, tergantung pada sistem), dan echoperintah dibangun ke sebagian besar shell. Versi yang berbeda memiliki cara yang berbeda (atau tidak ada cara) untuk menentukan atau menonaktifkan lolos untuk karakter kontrol.
printf, di sisi lain, memiliki variasi yang jauh lebih sedikit. Itu bisa ada sebagai perintah, biasanya /bin/printf, dan itu dibangun ke dalam beberapa shell (bash dan zsh memilikinya, tcsh dan ksh tidak), tetapi berbagai versi jauh lebih mirip satu sama lain daripada versi yang berbeda echo. Dan Anda tidak harus mengingat opsi baris perintah (dengan beberapa pengecualian; GNU Coreutils printf menerima --versiondan --help, dan built-in bash printf menerima -v varuntuk menyimpan output dalam variabel).
Sebagai contoh Anda:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
Dan sekarang saatnya bagi saya untuk mengakui bahwa itu echoakan berhasil juga untuk contoh yang Anda tanyakan; Anda hanya perlu memberikan tanda kutip ganda di sekitar argumen:
echo "[$res]"
seperti kmkaplan menulis (dua setengah tahun yang lalu, saya baru saja memperhatikan!). Masalah dengan perintah asli Anda:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
tidak dengan echo; itu adalah shell mengganti tab dengan spasi sebelum echopernah melihatnya.
echobaik untuk output sederhana, seperti echo hello world, tetapi Anda harus menggunakannya printfkapan pun Anda ingin melakukan sesuatu yang lebih kompleks. Anda bisa mulai echobekerja, tetapi kode yang dihasilkan cenderung gagal ketika Anda menjalankannya dengan echoimplementasi yang berbeda atau shell yang berbeda.
Anda juga dapat mencoba:
echo Hello$'\t'world.
Dari halaman bash man:
Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Kata diperluas ke string, dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C.
Jadi Anda bisa melakukan ini:
echo $'hello\tworld'
Gunakan kata demi kata keystroke, ^V( CTRL+V, C-v, apa pun ).
Saat Anda mengetik ^Vdi terminal (atau di sebagian besar editor Unix), karakter berikut akan diambil kata demi kata . Anda bisa menggunakan ini untuk mengetikkan karakter tab literal di dalam string yang Anda gema.
Sesuatu seperti karya berikut:
echo "^V<tab>" # CTRL+V, TAB
Bash docs ( qv , "quotes-insert")
dikutip-masukkan (Cq, Cv) Tambahkan karakter berikutnya yang Anda ketik ke baris kata demi kata. Ini adalah cara memasukkan urutan kunci seperti Cq, misalnya.
catatan: menurut ini, ALT+TAB harus melakukan hal yang sama, tetapi kita semua terikat urutan itu untuk beralih jendela sehingga kita tidak dapat menggunakannya
tab-insert (M-TAB) Masukkan karakter tab.
-
Catatan: Anda dapat menggunakan strategi ini dengan semua jenis karakter yang tidak biasa. Seperti pengembalian kereta:
echo "^V^M" # CTRL+V, CTRL+M
Ini karena carriage return adalah ASCII 13, dan M adalah huruf ke-13 dari alfabet, jadi ketika Anda mengetik ^M, Anda mendapatkan karakter ASCII ke-13. Anda dapat melihatnya beraksi menggunakan ls^M, pada prompt kosong, yang akan memasukkan carriage return, menyebabkan prompt untuk bertindak seperti Anda menekan return. Ketika karakter-karakter ini biasanya ditafsirkan, kata demi kata membuat Anda mendapatkan karakter literal.
grepuntuk menangkap garis yang berisi tabkarakter.
Menggunakan gema untuk mencetak nilai variabel adalah perangkap Bash yang umum. Tautan referensi: