Skrip bash yang berisi
for i in {a,b}-{1,2}; do
echo $i;
done
cetakan
a-1
a-2
b-1
b-2
ketika dieksekusi. Inilah yang saya harapkan - saat {a,b}
konstruksinya diperluas.
Namun, ketika skrip (lain) berisi
v={a,b}-{1,2}
echo $v
itu mencetak
{a,b}-{1,2}
yang bukan itu yang saya harapkan. Saya berharap untuk mencetak a-1 a-2 b-1 b-2
. Jelas, {a,b}
konstruksinya tidak diperluas.
Saya bisa membuatnya berkembang seperti itu
v=$(echo {a,b}-{1,2})
Berdasarkan pengamatan ini saya punya dua pertanyaan: 1) kapan {a,b}
konstruk diperluas? 2) apakah $(echo {a,b}-{1,2})
cara yang disukai untuk memicu ekspansi bila diperlukan?
bash
brace-expansion
René Nyffenegger
sumber
sumber
=
. Misalnya,v=a-1 a-2
tidak akan berfungsi.v=a-1 a-2
berartiassign 'a-1' to variable v and run 'a-2'
v=(a-1 a-2)
menetapkan array ke variabelv
.v+=(b-1 b-2)
menambahkannya.Jawaban:
The pengguna Bash mengatakan bahwa:
Perluasan brace tidak ada dalam daftar, sehingga tidak dilakukan untuk penugasan
v={a,b}-{1,2}
. Seperti yang disebutkan oleh @Wildcard, ekspansi sederhanav=a-1 v=b-1 ...
menjadi tidak masuk akal.Juga, ketika menjalankan
echo $v
, hal berikut ini berlaku:Ekspansi brace terjadi sebelum ekspansi variabel, sehingga kawat gigi yang ditugaskan
$v
tidak diperluas.Tetapi Anda dapat melakukan hal-hal seperti ini:
Perluasan dengan itu
$(echo ...)
akan berfungsi jika Anda tidak memiliki spasi kosong di string yang akan diperluas, dan karenanya tidak akan mengalami masalah dengan pemisahan kata. Cara yang lebih baik adalah menggunakan variabel array jika Anda bisa.mis. simpan ekspansi ke dalam array dan jalankan beberapa perintah dengan nilai yang diperluas:
sumber
Poin yang menarik. Mungkin membantu adalah kutipan berikut dari
man bash
:Perhatikan bahwa ekspansi brace TIDAK disebutkan dalam daftar.
Namun ini masih menimbulkan pertanyaan, yaitu: Bagaimana shell tahu bahwa ini adalah penugasan variabel dan dengan demikian tidak dikenakan ekspansi brace? Atau lebih tepatnya, di mana urutan parsing diklarifikasi dan dikodifikasikan sedemikian sehingga shell didefinisikan untuk mengidentifikasi tugas variabel sebelum menangani ekspansi brace? (Ini jelas cara
bash
kerjanya, tetapi saya belum menemukan baris dokumentasi yang menjelaskan hal ini.)sumber
LESS=+/SIMPLE man bash
).menurut pengetahuan lil saya {a, b, c} diperluas ketika langsung digemakan atau digunakan dengan perintah misalnya: mkdir ~ / {a, b, c}, tetapi ketika itu diatur ke variabel itu harus dievaluasi sebelum gema atau gunakan sebagai arggument!
karena Anda memiliki "a" diikuti oleh "b" dalam urutan alpha [az], dan "1" diikuti oleh "2" dalam urutan Desember [0-9]: Anda dapat menggunakan periode ganda ".." insteed of koma ", "
sumber
v
tidak diatur ke string literal "a-1 a-2 b-1 b-2". Atau setidaknya mengapa tidak ada kesalahan yang dilemparkan saat Anda mendapatkan jika Anda mengetik perintah:v=a-1 v=a-2 v=b-1 v=b-2
(yang Anda harapkan penugasan variabel diperluas ke). Itu pertanyaan yang bagus; ini tidak benar-benar menjawabnya.Menetapkan ke variabel dalam bash tidak memperluas ekspresi.
Untuk skrip kecil ini, x akan berisi
"*"
dan bukan perluasan dari"*"
:Namun, beberapa nilai diperluas, ref. jawaban yang bagus dari ilkkachu.
Ekspresi diperluas ketika mereka dievaluasi.
Seperti ini:
Atau seperti ini:
Atau seperti ini:
Memicu
$()
cukup umum dan saya pikir itu lebih disukaieval
, tetapi yang terbaik mungkin tidak memicu evaluasi sama sekali, sampai variabel benar-benar digunakan dalam suatu perintah.sumber