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