O Manual de Bash diz que:
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.
A expansão de contraventamento não está na lista, por isso não é realizada para a atribuição v={a,b}-{1,2}
. Como mencionado por @Wildcard, a expansão simples para v=a-1 v=b-1 ...
seria sem sentido de qualquer maneira.
Além disso, ao executar o echo $v
, o seguinte se aplica:
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.
A expansão de contraventamento acontece antes da expansão da variável, portanto, as chaves atribuídas a $v
não são expandidas.
Mas você pode fazer coisas assim:
$ var_this=foo var_that=bar
$ echo $var_{this,that}
foo bar
A expansão com $(echo ...)
deve funcionar se você não tiver espaço em branco na string a ser expandida e, portanto, não terá problemas com a divisão de palavras. Uma maneira melhor seria usar uma variável array, se puder.
por exemplo. salve a expansão em um array e execute algum comando com os valores expandidos:
$ v=( {a,b}-{1,2} )
$ some_command "${v[@]}"