GNU/Linux >> Belajar Linux >  >> Linux

Ekspansi &Variabel Bash Brace?

Pertanyaan ini sudah memiliki jawaban di sini :Bisakah saya menggunakan variabel di dalam ekspansi {} tanpa `eval`?

(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"

Linux
  1. Trik Bash yang lebih bodoh:Variabel, temukan, deskriptor file, dan operasi jarak jauh

  2. Bagaimana Menunda Ekspansi Variabel?

  3. Cara Menemukan Panjang String di Bash [Kiat Singkat]

  1. Spasi Untuk Variabel Dalam Skrip Bash?

  2. Apakah `~#` Sebuah Ekspansi Tilde Dari Bash?

  3. Variabel "Bersarang" di bash

  1. temukan dan salin file menggunakan Bash

  2. Fungsi Bash untuk menemukan pola pencocokan file terbaru

  3. Cara gzip semua file di semua sub-direktori di bash