Saya ingin menampilkan string semua karakter ascii dengan perintah berikut
for i in `seq 32 127`; do printf "%c" $i; done
Output dari perintah di atas adalah:
33333334444444444555555555566666666667777777777..............
Ini adalah digit pertama (dari kiri) dari setiap nomor.
Melihat melalui situs ini saya menemukan jawaban untuk masalah saya. Bagaimana cara mencetak semua karakter ASCII yang dapat dicetak di CLI? , namun saya masih tidak mengerti mengapa cuplikan asli saya tidak menampilkan karakter ascii sebagaimana dimaksud.
bash
shell
character-encoding
ascii
Ifthikhan
sumber
sumber
comp.unix.shell
utas mengapa itu hal yang benar;)
Jawaban:
Anda tidak dapat langsung mencetak kode ascii dengan menggunakan
printf "%c" $i
sejenisnya di C.Anda harus terlebih dahulu mengkonversi nilai desimal i menjadi nilai oktal dan kemudian Anda harus mencetaknya menggunakan
printf
dan meletakkan\
di depan nilai oktal masing-masing.Untuk mencetak
A
, Anda harus mengubah desimal 65 menjadi oktal, yaitu 101, dan kemudian Anda harus mencetak nilai oktal itu sebagai:Ini akan dicetak
A
.Jadi, Anda harus memodifikasinya untuk:
Tetapi dengan menggunakan
awk
Anda dapat langsung mencetak seperti dalam bahasa C.sumber
bash
danzsh
ini dapat dilakukan tanpa loop dan tanpa perintah eksternal:printf $(printf '\%o' {32..127})
.(char)(127)
backspace atau semacamnya. Apa pun itu, ia muncul sebagai salah satu kotak hex atau apa pun namanya. Jika Anda hanya menginginkan "printable" (yaitu dapat dibaca), langsung saja ke 126. Juga, pemikiran yang bagus dengan oktal. Itu pintar; Saya sedang berpikir dalam heksadesimal (sepertiprintf '\x%x; {32..126}
... atau 127, saya kira, karena kalian semua juga melakukannya), tetapi itu tidak berhasil. Oktal menyelamatkan hari! :) Akhirnya, @Ifthikhan, saya tidak yakin apa yang Anda maksud.awk
sering menggunakan perintah C-style dan tidak ada tempat lain%c
digunakan. Menggunakan angka oktal berbeda dari menggunakan karakter satu byte.%c
Menafsirkan argumen terkait sebagai karakter: hanya karakter pertama dari argumen yang diberikan yang dicetakAnda sepertinya sudah memiliki cara untuk mencetaknya, tetapi di sini ada satu varian.
sumber
Anda perlu
printf
, tetapi hanya sekali; Anda dapat mengganti satu penggunaanprintf
denganecho
urutan Bash escape yang lebih sederhana dan lebih efisien :Dengan hexagesimal:
Dengan oktal:
sumber