Jawaban:
echo -e ' \t '
akan menampilkan 'spasi ruang baris baru' ( -e
berarti 'aktifkan interpretasi backslash lolos'):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
tidak berhasil dari Makefiles?
echo -e
bukan POSIX dan make
panggilan /bin/sh
yang biasanya bukan penggunaan program gunakan secara interaktif, dan biasanya belum -e
diimplementasikan. Untuk portabilitas, gunakan printf '\t'
saja.
man
halaman untuk echo
perintah tidak menyebutkan opsi -e
. Namun, opsi ini diterima.
Gunakan printf
, bukan echo
.
Ada beberapa versi echo
perintah yang berbeda. Ada /bin/echo
(yang mungkin atau mungkin bukan versi GNU Coreutils, tergantung pada sistem), dan echo
perintah 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 --version
dan --help
, dan built-in bash printf menerima -v var
untuk 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 echo
akan 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 echo
pernah melihatnya.
echo
baik untuk output sederhana, seperti echo hello world
, tetapi Anda harus menggunakannya printf
kapan pun Anda ingin melakukan sesuatu yang lebih kompleks. Anda bisa mulai echo
bekerja, tetapi kode yang dihasilkan cenderung gagal ketika Anda menjalankannya dengan echo
implementasi 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 ^V
di 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.
grep
untuk menangkap garis yang berisi tab
karakter.
Menggunakan gema untuk mencetak nilai variabel adalah perangkap Bash yang umum. Tautan referensi: