GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa memeriksa karakter kata demi kata dari string perintah bash?

Anda dapat menggunakan cat dengan -A opsi:dari manual:

   -A, --show-all
          equivalent to -vET
   -E, --show-ends
          display $ at end of each line
   -T, --show-tabs
          display TAB characters as ^I
   -v, --show-nonprinting
          use ^ and M- notation, except for LFD and TAB

Jadi cat -A yourscrip.sh akan menunjukkan kepada Anda karakter yang tidak terlihat dan aneh.


Salah satu opsinya adalah melihat karakter yang Anda coba gunakan dengan hex viewer atau editor. hexdump adalah opsi yang bagus jika Anda terbatas pada terminal.

$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000  5b 20 2d 66 20 2f 65 74  63 2f 6f 70 65 6e 76 70  |[ -f /etc/openvp|
00000010  6e 2f 63 6c 69 65 6e 74  2e 63 6f 6e 66 20 5d 20  |n/client.conf ] |
00000020  26 26 20 65 63 68 6f 20  74 72 75 65 0a           |&& echo true.|
0000002d

Anda dapat melihat di sini bahwa space , close-square-brace , space sudah benar - 0x20 , 0x5D , 0x20 .

Nilai-nilai ini adalah kode ASCII, ditampilkan dalam heksadesimal. Nilai apa pun di luar rentang 0x20 - 0x7E bukan "karakter yang dapat dicetak " sejauh menyangkut ASCII, dan kemungkinan besar tidak akan bekerja dengan baik dengan antarmuka baris perintah.

Catatan: Saya menyalin "rusak pertama Anda " untuk digunakan dalam hexdump contoh di atas, jadi ada sesuatu yang menggantikan not-an-ASCII-space dengan spasi ASCII antara sumber asli dan pertanyaan yang Anda berikan.

Untuk mengulanginya, lakukan langkah-langkah berikut:

  1. Ketik hexdump -Cv <<"EOF" dan tekan Enter
  2. Tempelkan teks yang ingin Anda gunakan
  3. Ketik EOF pada barisnya sendiri, dan tekan Enter

Terminal dan Antarmuka Baris Perintah tidak menangani karakter khusus dengan baik - seperti yang telah Anda temukan. Jika Anda tidak terlalu berhati-hati dalam memformat dokumen, Anda juga akan mengalami masalah dengan Microsoft Word (dan lainnya) menggunakan "kutipan cerdas ", em-dash, daftarnya terus berlanjut...

Temukan perbedaannya:(bagian atas adalah "kutipan cerdas ", bagian bawahnya adalah "tanda kutip langsung ")

$ hexdump -Cv <<"EOF"
> “quoted string”
> EOF
00000000  e2 80 9c 71 75 6f 74 65  64 20 73 74 72 69 6e 67  |...quoted string|
00000010  e2 80 9d 0a                                       |....|
00000014

Di sini, kutipan terbuka bukanlah kutipan ASCII sederhana (" ), tetapi merupakan seri Unicode / UTF-8 - 0xE2 , 0x80 , 0x9C , atau U+201C - yang tidak akan ditangani oleh terminal seperti yang Anda harapkan.

Saran Kiwy tentang cat -A juga melakukan pekerjaan:

$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$

Catatan: saat menggunakan echo "..." | hd , Anda memiliki peluang bash akan menggantikan bagian dari string yang Anda coba periksa. Ini menjadi perhatian khusus saat mencoba memeriksa komponen skrip.

Misalnya coba:

$ echo "${USER}"
attie

$ echo "`whoami`"
attie

$ echo "$(whoami)"
attie

$ cat <<EOF
> ${USER}
> EOF
attie

Metode ini mengganti komponen dengan teks yang relevan. Untuk menghindarinya, gunakan salah satu pendekatan berikut. Perhatikan penggunaan tanda kutip tunggal (' ), dan "dikutip heredoc " ("EOF" ).

$ echo '${USER}'
${USER}

$ echo '`whoami`'
`whoami`

$ echo '$(whoami)'
$(whoami)

$ cat <<"EOF"
> ${USER}
> EOF
${USER}

echo "<your command>" | hd harus bekerja. Cari backspace (0x08) atau karakter dengan kode>=80. echo "<your command>" | wc -b dan memeriksa apakah hitungan sesuai dengan yang Anda lihat juga merupakan ide yang bagus.

Menyalin barang dari file yang dihasilkan oleh apa pun dengan nama "Office" berbahaya, karena perangkat lunak semacam itu sering mengambil kebebasan untuk mengganti karakter:dalam bahasa Prancis, cari tanda kutip ganda diganti dengan "guillemets", dalam bahasa Inggris untuk tanda kutip biasa diganti dengan mereka membuka/menutup ekuivalen. Yang paling sulit yang pernah saya temukan adalah ruang non-breaking dengan lebar 0 di tengah nama file (3 hari waktu henti server...).


Linux
  1. Bagaimana Cara Memeriksa Apakah Bash Dapat Mencetak Warna?

  2. Cara Memeriksa apakah String Berisi Substring di Bash

  3. Bagaimana saya bisa mengingat argumen dari perintah bash sebelumnya?

  1. Bagaimana saya bisa menambahkan string ke awal setiap file dalam folder di bash?

  2. Bagaimana saya bisa mendapatkan nomor terakhir dari string di bash?

  3. Bagaimana cara cepat mengubah kata pertama dalam perintah Bash?

  1. Bagaimana cara kerja cat << EOF di bash?

  2. Bagaimana saya bisa mengeksekusi kode PHP dari baris perintah?

  3. Bagaimana saya bisa menjalankan pemeriksaan nagios secara manual dari baris perintah?