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 :
- Apa itu ekspansi variabel di unix/linux berbicara?
Bagian kedua dari pertanyaan saya berkaitan dengan istilah berikut :
- bola
- 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.)
- Ambil nilai variabelnya, yaitu string. Jika variabel tidak ditentukan, gunakan string kosong.
- Jika konstruk menyertakan transformasi, terapkan. Misalnya, jika konstruknya adalah
${VARIABLE#TEXT}
, dan nilai variabel dimulai denganTEXT
, hapusTEXT
dari awal nilainya. - 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.
- 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. - 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:
- Nilai variabelnya adalah string 8 karakter
a* b* c*
. #??
berarti menghapus dua karakter pertama, menghasilkan string 6 karakterb* c*
(dengan spasi awal).- Jika perluasan berada dalam konteks daftar (yaitu tidak dalam tanda kutip ganda atau konteks serupa lainnya), lanjutkan.
- Pisahkan string menjadi kata-kata yang dipisahkan spasi, menghasilkan daftar dua string:
b*
danc*
. - String
b*
, ditafsirkan sebagai pola, cocok dengan dua file:bar
danbaz
. Stringc*
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).
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?