GNU/Linux >> Znalost Linux >  >> Linux

Expanze závorky Bash a proměnné?

Tato otázka zde již obsahuje odpovědi :Mohu použít proměnné uvnitř rozšíření {} bez `eval`?

(3 odpovědi)
Uzavřeno před 6 lety.

Mám příkaz find:

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Chci nahradit Alpha,Bravo,Charlie s $find_dir

find Directory/{$find_dir} arg1 arg2

druhý se však rozšiřuje na

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

spíše než

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

Proč? Je to součást poměrně složitého bash skriptu, který může mít více či méně adresářů, z nichž ne všechny jsou relevantní (takže globování Upload/* by nefungovalo). Takže když teď nastavím tři a přidám další, budu je muset později přidat ručně. Navíc potřebuji, aby to běželo z kořene adresářů, aby se zachovala perspektiva výstupů nálezů (./Upload/Dir/file na rozdíl od ./Dir/file).

Ale použití proměnné by mi umožnilo to změnit podle potřeby a zachovat to relevantní pro ostatní části skriptu.

Přijatá odpověď:

Z bash dokumentace, sekce Rozšíření vzpěry:

Rozšíření složené závorky se provádí před jakýmikoli jinými rozšířeními a všechny
znaky speciální pro jiná rozšíření jsou ve výsledku zachovány
. Je
je přísně textový. Bash neaplikuje žádnou syntaktickou interpretaci
na kontext rozšíření nebo text mezi složenými závorkami. Aby se
předešlo konfliktům s rozšířením parametrů, řetězec „${“ není
považován za vhodný pro rozšíření složené závorky.

Další poznámka v bash :

Pořadí expanzí je:expanze složené závorky, expanze vlnovky,
parametr, proměnná a aritmetická expanze a substituce příkazů (provádí se zleva doprava) , rozdělení slov a
rozšíření souboru.

Takže ve vašem případě bash viděl expanze složené závorky před proměnnou expanzí, nejprve provede expanzi závorky, výsledkem je {Alpha,Bravo,Charlie} .

Pokud můžete ovládat $find_dir proměnný obsah, můžete použít eval :

eval "find Directory/{$find_dir} arg1 arg2"

Linux
  1. Jak odložit variabilní expanzi?

  2. Prostory pro proměnné ve skriptu Bash?

  3. Použít proměnné uvnitř rozšíření {} bez `eval`?

  1. Funkce v proměnných Shell?

  2. Sdílení proměnných ve více skriptech Shell?

  3. Je `~#` Tilde Expanze of Bash?

  1. Pochopení proměnných v Bash Shell pod Linuxem

  2. bash najít adresáře

  3. Jak gzipovat všechny soubory ve všech podadresářích v bash