Bagaimana cara menggema satu atau lebih karakter tab menggunakan skrip bash? Ketika saya menjalankan kode ini
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
Saya mengerti
res=[ x] # that is [<space>x]
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 danmake
panggilan/bin/sh
yang biasanya bukan penggunaan program gunakan secara interaktif, dan biasanya belum-e
diimplementasikan. Untuk portabilitas, gunakanprintf '\t'
saja.man
halaman untukecho
perintah tidak menyebutkan opsi-e
. Namun, opsi ini diterima.Gunakan
printf
, bukanecho
.Ada beberapa versi
echo
perintah yang berbeda. Ada/bin/echo
(yang mungkin atau mungkin bukan versi GNU Coreutils, tergantung pada sistem), danecho
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 berbedaecho
. 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:
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:seperti kmkaplan menulis (dua setengah tahun yang lalu, saya baru saja memperhatikan!). Masalah dengan perintah asli Anda:
tidak dengan
echo
; itu adalah shell mengganti tab dengan spasi sebelumecho
pernah melihatnya.echo
baik untuk output sederhana, sepertiecho hello world
, tetapi Anda harus menggunakannyaprintf
kapan pun Anda ingin melakukan sesuatu yang lebih kompleks. Anda bisa mulaiecho
bekerja, tetapi kode yang dihasilkan cenderung gagal ketika Anda menjalankannya denganecho
implementasi yang berbeda atau shell yang berbeda.sumber
Letakkan string Anda di antara tanda kutip ganda :
sumber
Anda juga dapat mencoba:
sumber
Anda perlu menggunakan flag -e untuk echo maka Anda bisa
sumber
Dari halaman bash man:
Jadi Anda bisa melakukan ini:
sumber
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:
Bash docs ( qv , "quotes-insert")
catatan: menurut ini,
ALT+TAB
harus melakukan hal yang sama, tetapi kita semua terikat urutan itu untuk beralih jendela sehingga kita tidak dapat menggunakannya-
Catatan: Anda dapat menggunakan strategi ini dengan semua jenis karakter yang tidak biasa. Seperti pengembalian kereta:
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 menggunakanls^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.sumber
grep
untuk menangkap garis yang berisitab
karakter.Menggunakan gema untuk mencetak nilai variabel adalah perangkap Bash yang umum. Tautan referensi:
http://mywiki.wooledge.org/BashPitfalls#echo_.24foo
sumber
Jika Anda ingin menggunakan
echo "a\tb"
skrip, Anda menjalankan skrip sebagai:Atau, Anda dapat memberikan kepada myscript.sh izin eksekusi, dan kemudian jalankan script.
sumber
sumber