GNU/Linux >> Belajar Linux >  >> Linux

Ekspansi Variabel Shell Dan Pengaruh Glob Dan Split Di atasnya?

Posting ini sebenarnya berisi dua pertanyaan terpisah tetapi saya pikir mengelompokkannya bersama akan memberikan lebih banyak konteks. Saya telah menjawab pertanyaan ini tentang kutipan di sekitar variabel tetapi saya tidak begitu mengerti apa ekspansi variabel berarti di tempat pertama. Jadi pertanyaan pertama saya adalah :

  1. Apa itu ekspansi variabel di unix/linux berbicara?

Bagian kedua dari pertanyaan saya berkaitan dengan istilah berikut :

  1. bola
  2. berpisah

Apa artinya di atas dan bagaimana pengaruhnya terhadap ekspansi variabel? Jawaban atas pertanyaan awal menyebutkan sebagai berikut:

Pikirkan tidak adanya tanda kutip (dalam konteks daftar) sebagai operator split+glob
.

Seolah-olah echo $test adalah echo glob(split(“$test”)).

Saya tidak dapat menemukan jawaban yang secara langsung membahas konsep globbing dan membelah melainkan menggunakan istilah tersebut secara langsung dalam menjawab pertanyaan lain seperti yang baru-baru ini.

Jawaban yang Diterima:

Perluasan variabel (istilah standarnya adalah perluasan parameter , dan terkadang juga disebut substitusi variabel ) pada dasarnya berarti mengganti variabel dengan nilainya. Lebih tepatnya, itu berarti mengganti $VARIABLE konstruksi (atau ${VARIABLE} atau ${VARIABLE#TEXT} atau konstruksi lain) oleh beberapa teks lain yang dibangun dari nilai variabel. Teks lain ini adalah perluasan dari variabel.

Proses ekspansi berjalan sebagai berikut. (Saya hanya membahas kasus umum, beberapa pengaturan dan ekstensi shell mengubah perilaku.)

  1. Ambil nilai variabelnya, yaitu string. Jika variabel tidak ditentukan, gunakan string kosong.
  2. Jika konstruk menyertakan transformasi, terapkan. Misalnya, jika konstruknya adalah ${VARIABLE#TEXT} , dan nilai variabel dimulai dengan TEXT , hapus TEXT dari awal nilainya.
  3. Jika konteksnya memanggil satu kata (misalnya dalam tanda kutip ganda, atau di sisi kanan tugas, atau di dalam dokumen di sini), berhenti di sini. Jika tidak, lanjutkan dengan langkah berikutnya.
  4. Pisahkan nilai menjadi kata-kata terpisah di setiap urutan spasi putih. (Variabel IFS dapat diubah untuk membagi karakter selain spasi.) Dengan demikian, hasilnya bukan lagi string, tetapi daftar string. Daftar ini bisa kosong jika nilainya hanya berisi spasi.
  5. Perlakukan setiap elemen daftar sebagai pola wildcard nama file, yaitu glob . Jika polanya cocok dengan beberapa file, maka akan diganti dengan daftar nama file yang cocok, jika tidak maka dibiarkan saja.

Misalnya, misalkan variabel foo berisi a* b* c* dan direktori saat ini berisi file bar , baz dan paz . Kemudian ${foo#??} diperluas sebagai berikut:

  1. Nilai variabelnya adalah string 8 karakter a* b* c* .
  2. #?? berarti menghapus dua karakter pertama, menghasilkan string 6 karakter  b* c* (dengan spasi awal).
  3. Jika perluasan berada dalam konteks daftar (yaitu tidak dalam tanda kutip ganda atau konteks serupa lainnya), lanjutkan.
  4. Pisahkan string menjadi kata-kata yang dipisahkan spasi, menghasilkan daftar dua string:b* dan c* .
  5. String b* , ditafsirkan sebagai pola, cocok dengan dua file:bar dan baz . String c* tidak cocok dengan file sehingga dibiarkan saja. Hasilnya adalah daftar tiga string:bar , baz , c* .

Misalnya echo ${foo#??} mencetak bar baz c* (perintah echo menggabungkan argumennya dengan spasi di antaranya).

Terkait:Apa yang TIDAK dipasang pada SSD?

Untuk lebih jelasnya, lihat:

  • Perluasan parameter dalam standar POSIX, diikuti oleh pemisahan bidang dan perluasan nama jalur
  • Perluasan parameter shell di manual bash, diikuti dengan pemisahan kata dan perluasan nama file
  • $VAR vs ${VAR} dan mengutip atau tidak mengutip
  • Kapan kutipan ganda diperlukan?

Linux
  1. Campuran skrip shell dan python mungkin?

  2. Shell - Tulis konten variabel ke file

  3. Perbedaan antara '{}' dan {} dalam perintah find?

  1. Perbedaan Antara Shell Login dan Shell Non-login?

  2. Menyimpan Output Perintah Dalam Variabel Shell?

  3. Bagaimana Cara Mendapatkan Alamat Ip Sendiri Dan Menyimpannya Ke Variabel Dalam Script Shell?

  1. Shell mana yang tidak mendukung ekspansi tanda kurung dolar, dan meminta backtick?

  2. Bagaimana Menunda Ekspansi Variabel?

  3. Mengapa Regex Di Bash Hanya Bekerja Jika Itu Adalah Variabel Dan Tidak Secara Langsung??