Posting ini sebenarnya mengandung dua pertanyaan terpisah tetapi saya pikir pengelompokan bersama akan memberikan lebih banyak konteks. Saya telah melalui pertanyaan ini tentang tanda kutip di sekitar variabel tapi saya tidak begitu mengerti apa arti ekspansi variabel di tempat pertama. Jadi pertanyaan pertama saya adalah:
- Apa yang dimaksud dengan ekspansi variabel di bicara unix / linux?
Bagian kedua dari pertanyaan saya terkait dengan persyaratan berikut:
- gumpal
- membagi
Apa arti hal di atas dan bagaimana pengaruhnya terhadap ekspansi variabel? Jawaban untuk pertanyaan awal menyebutkan sebagai berikut:
Pikirkan tentang tidak adanya tanda kutip (dalam konteks daftar) sebagai operator split + glob.
Seolah echo $ test adalah echo glob (split ("$ test")).
Saya tidak dapat menemukan jawaban yang secara langsung membahas konsep globbing dan splitting, melainkan menggunakan istilah-istilah itu secara langsung dalam menjawab pertanyaan-pertanyaan lain seperti yang baru-baru ini .
Jawaban:
Ekspansi variabel (istilah standarnya adalah ekspansi parameter , dan kadang-kadang disebut juga subtitusi variabel ) pada dasarnya berarti mengganti variabel dengan nilainya. Lebih tepatnya, itu berarti mengganti
$VARIABLE
konstruk (atau${VARIABLE}
atau${VARIABLE#TEXT}
konstruk lain) dengan 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 memodifikasi perilaku.)
${VARIABLE#TEXT}
, dan nilai variabel dimulai denganTEXT
, hapusTEXT
dari awal nilai.IFS
dapat diubah untuk dipisah pada karakter selain spasi putih.) Dengan demikian hasilnya bukan lagi string, tetapi daftar string. Daftar ini bisa kosong jika nilai hanya berisi spasi putih.Misalnya, anggap bahwa variabel
foo
berisia* b* c*
dan direktori saat ini berisi filebar
,baz
danpaz
. Kemudian${foo#??}
diperluas sebagai berikut:a* b* c*
.#??
berarti melepaskan dua karakter pertama, menghasilkan string 6 karakterb* c*
(dengan spasi awal).b*
danc*
.b*
, yang ditafsirkan sebagai pola, cocok dengan dua file:bar
danbaz
. Stringc*
tidak cocok dengan file sehingga dibiarkan sendiri. Hasilnya adalah daftar tiga senar:bar
,baz
,c*
.Misalnya
echo ${foo#??}
mencetakbar baz c*
(perintahecho
bergabung argumennya dengan spasi di antaranya).Untuk detail lebih lanjut, lihat:
sumber
$var
) dan jenis lain dari parameter seperti$1
,$#
,$?
,$-
...gumpalan / split
Saya akan mengambil glob / split dulu. @ Stephane menjawab Anda terhubung dengan menggunakan istilah-istilah itu dalam pengertian umum. Itu bukan perintah aktual atau semacamnya, hanya operasi semu.
Itu
split("$test")
akan membagi konten "$ test" menjadi "array" elemen.The
glob(...)
kemudian akan mengurus untuk memperluas setiap elemen ini yang mengandung shell globbing karakter seperti*
atau rentang[1-2]
.Contoh
Katakan string kita
$test
adalah sebagai berikut.Juga katakanlah kita memiliki direktori dengan beberapa file di dalamnya.
Sekarang jika kami mencoba untuk menggemakannya tanpa tanda kutip, Anda harus memperhatikan bahwa string kami terpecah pada spasi, dan kemudian setiap karakter globbing diperluas.
Namun jika kita mengutip variabel ketika kita meneruskannya sebagai argumen untuk
echo
kita akan mendapatkan string literal asli.ekspansi variabel
Istilah ekspansi variabel dimaksudkan untuk mencakup operasi dasar yang dilakukan shell sebagai bagian dari operasi dasar itu. Shell bertanggung jawab atas penguraian input dan kemudian mengeksekusi input ini setelah dianggap benar secara sintaksis.
Dalam contoh kita sebelumnya. Ketika variabel
$test
disajikan untukecho
dikutip, kami memberi tahu shell untuk terus maju dan membagi argumen itu dan kemudian menggumpalnya.Ketika dikutip, kami pada dasarnya menonaktifkan fitur itu dengan variabel apa pun yang kami bungkus dengan tanda kutip ganda.
Contoh
Berikut adalah beberapa contoh tambahan dari globbing dan splitting.
Glob / perpecahan terjadi secara otomatis
Glob / pemisahan dinonaktifkan melalui penawaran ganda
sumber