(3 jawaban)
Tutup 6 tahun lalu.
Saya memiliki perintah find:
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
Saya ingin mengganti Alpha,Bravo,Charlie
dengan $find_dir
find Directory/{$find_dir} arg1 arg2
namun yang terakhir berkembang menjadi
find Directory/{Alpha,Bravo,Charlie} arg1 arg2
ketimbang
find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2
Mengapa? Ini adalah bagian dari skrip bash yang cukup rumit yang mungkin memiliki lebih banyak atau lebih sedikit direktori, tidak semua yang relevan (sehingga globbing Upload/* tidak akan berfungsi). Jadi jika saya menyiapkan tiga sekarang dan menambahkan yang lain, saya harus menambahkannya secara manual nanti. Selain itu, saya perlu menjalankannya dari akar direktori agar tetap menemukan perspektif keluaran (./Upload/Dir/file sebagai lawan dari ./Dir/file).
Tetapi menggunakan variabel akan memungkinkan saya untuk mengubahnya sesuai kebutuhan dan membuatnya tetap relevan dengan bagian lain dari skrip.
Jawaban yang Diterima:
Dari bash
dokumentasi, bagian Ekspansi Brace:
Perluasan kurung dilakukan sebelum perluasan lainnya, dan setiap
karakter khusus untuk perluasan lain dipertahankan dalam hasil . Ini
benar-benar tekstual. Bash tidak menerapkan interpretasi sintaksis apa pun
ke konteks perluasan atau teks di antara kurung kurawal. Untuk
menghindari konflik dengan ekspansi parameter, string '${' tidak
dianggap memenuhi syarat untuk ekspansi brace.
Catatan lain, di bash
:
Urutan ekspansi adalah:ekspansi brace, ekspansi tilde,
parameter, variabel, dan ekspansi aritmatika dan substitusi perintah (dilakukan dengan cara kiri-ke-kanan) , pemisahan kata, dan perluasan
nama file.
Jadi dalam kasus Anda, bash
melihat ekspansi brace sebelum ekspansi variabel, itu akan melakukan ekspansi brace terlebih dahulu, menghasilkan hasil {Alpha,Bravo,Charlie}
.
Jika Anda dapat mengontrol $find_dir
konten variabel, Anda dapat menggunakan eval
:
eval "find Directory/{$find_dir} arg1 arg2"