Podręcznik Bash mówi, że:
SIMPLE COMMAND EXPANSION
When a simple command is executed, the shell performs the following
expansions, assignments, and redirections, from left to right.
[...]
4. The text after the = in each variable assignment undergoes tilde
expansion, parameter expansion, command substitution, arithmetic
expansion, and quote removal before being assigned to the variable.
Rozszerzenie nawiasu klamrowego nie znajduje się na liście, więc nie jest wykonywane dla przypisania v={a,b}-{1,2}
. Jak wspomniano w @Wildcard, proste rozszerzenie do i tak v=a-1 v=b-1 ...
byłoby bez sensu.
Ponadto podczas wykonywania echo $v
obowiązują następujące zasady:
EXPANSION
Expansion is performed on the command line after it has been split
into words. [...]
The order of expansions is: brace expansion; tilde expansion,
parameter and variable expansion, arithmetic expansion, and command
substitution (done in a left-to-right fashion); word splitting; and
pathname expansion.
Rozwinięcie nawiasów następuje przed rozwinięciem zmiennej, więc przypisane nawiasy klamrowe $v
nie są rozwijane.
Ale możesz robić takie rzeczy:
$ var_this=foo var_that=bar
$ echo $var_{this,that}
foo bar
Rozwinięcie go za pomocą $(echo ...)
powinno działać, jeśli nie ma żadnych białych znaków w ciągu, który ma zostać rozwinięty, a zatem nie będzie miał problemów z dzieleniem słów. Lepszym sposobem może być użycie zmiennej tablicowej, jeśli możesz.
np. zapisz rozwinięcie do tablicy i uruchom polecenie z rozszerzonymi wartościami:
$ v=( {a,b}-{1,2} )
$ some_command "${v[@]}"
=
. Na przykładv=a-1 a-2
nie będzie działać.