GNU/Linux >> Belajar Linux >  >> Linux

Ekspansi String yang Dikutip Vs Tidak Dikutip?

  1. for i in $(xrandr); do echo "$i" ; done
  2. for i in "$(xrandr)"; do echo "$i"; done
  3. for i in "$(xrandr)"; do echo $i; done

Saya mengerti mengapa 1 berbeda dari 2. Tapi mengapa 3 memberikan output yang berbeda dari 2? Tolong jelaskan outputnya juga. Bagaimana cara kerja kutipan di baris baru?

Jawaban yang Diterima:

Variabel yang tidak dikutip (seperti dalam $var ) atau substitusi perintah (seperti dalam $(cmd) atau `cmd` ) adalah split+glob operator di shell mirip Bourne.

Artinya, konten mereka dibagi menurut nilai saat ini dari $IFS variabel khusus (yang secara default berisi karakter spasi, tab, dan baris baru)

Dan kemudian setiap kata yang dihasilkan dari pemisahan itu tunduk pada pembuatan nama file (juga dikenal sebagai globbing atau ekspansi nama file ), yaitu, mereka dianggap sebagai pola dan diperluas ke daftar file yang cocok dengan pola itu.

Jadi di for i in $(xrandr) , $(xrandr) , karena tidak dalam tanda kutip, dibagi berdasarkan urutan spasi, tab, dan karakter baris baru. Dan setiap kata yang dihasilkan dari pemisahan tersebut diperiksa untuk mencocokkan nama file (atau dibiarkan apa adanya jika tidak cocok dengan file apa pun), dan for mengulang semuanya.

Di for i in "$(xrandr)" , kami tidak menggunakan operator split+glob sebagai substitusi perintah dikutip, jadi ada satu operan dalam loop pada satu nilai:output dari xrandr (tanpa tambahan karakter baris baru yang mengganti perintah strip).

Namun dalam echo $i , $i tidak dikutip lagi, jadi sekali lagi isi $i dipecah dan tunduk pada pembuatan nama file dan itu diteruskan sebagai argumen terpisah ke echo perintah (dan echo menampilkan argumennya yang dipisahkan oleh spasi).

Jadi pelajaran yang didapat:

  • jika Anda tidak ingin pemisahan kata atau pembuatan nama file , selalu kutip ekspansi variabel dan substitusi perintah
  • jika Anda ingin pemisahan kata atau pembuatan nama file , biarkan tanpa tanda kutip tetapi setel $IFS sesuai dan/atau aktifkan atau nonaktifkan pembuatan nama file jika diperlukan (set -f , set +f ).

Biasanya, dalam contoh Anda di atas, jika Anda ingin mengulang daftar kata kosong yang dipisahkan dalam output xrandr , Anda harus:

  • keluar dari $IFS pada nilai defaultnya (atau tidak disetel) untuk dipisah menjadi kosong
  • Gunakan set -f untuk menonaktifkan pembuatan nama file kecuali Anda yakin bahwa xrandr tidak pernah menampilkan * atau ? atau [ karakter (yang merupakan karakter pengganti yang digunakan dalam pola pembuatan nama file)
Terkait:Db2 – temukan string koneksi untuk database DB2?

Dan kemudian hanya gunakan operator split+glob (hanya biarkan substitusi perintah atau ekspansi variabel tidak dikutip) di in bagian dari for lingkaran:

set -f; unset -v IFS
for i in $(xrandr); do whatever with "$i"; done

Jika Anda ingin mengulang baris (tidak kosong) dari xrandr output, Anda harus mengatur $IFS ke karakter baris baru:

IFS='
'

Linux
  1. Bagaimana Cara Mengganti String Dalam File?

  2. Penggantian String Menggunakan Kamus?

  3. Apakah `~#` Sebuah Ekspansi Tilde Dari Bash?

  1. Cara Memisahkan String dalam Skrip Bash

  2. menggunakan acak untuk menghasilkan string acak di bash

  3. Tambahkan baris baru ke string, lintas platform

  1. Jumlah File yang Mengandung String yang Diberikan?

  2. Ekspansi &Variabel Bash Brace?

  3. informasi Edi