Um script bash que contém
for i in {a,b}-{1,2}; do
echo $i;
done
impressões
a-1
a-2
b-1
b-2
quando executado. Era o que eu esperava - à medida que a {a,b}
construção é expandida.
No entanto, quando (outro) script contém
v={a,b}-{1,2}
echo $v
imprime
{a,b}-{1,2}
o que não é o que eu esperava. Eu esperava que fosse impresso a-1 a-2 b-1 b-2
. Obviamente, a {a,b}
construção não é expandida.
Eu posso fazê-lo expandir assim
v=$(echo {a,b}-{1,2})
Com base nessas observações, tenho duas perguntas: 1) quando o {a,b}
construto é expandido? 2) é $(echo {a,b}-{1,2})
a maneira preferida de desencadear uma expansão quando necessário?
bash
brace-expansion
René Nyffenegger
fonte
fonte
=
. Por exemplo,v=a-1 a-2
não vai funcionar.v=a-1 a-2
significaassign 'a-1' to variable v and run 'a-2'
v=(a-1 a-2)
atribui a matriz à variávelv
.v+=(b-1 b-2)
anexa a ele.Respostas:
O manual do Bash diz que:
A expansão de chaves não está na lista e, portanto, não é realizada para a atribuição
v={a,b}-{1,2}
. Conforme mencionado pelo @Wildcard, a simples expansão parav=a-1 v=b-1 ...
seria sem sentido de qualquer maneira.Além disso, ao executar o
echo $v
, o seguinte se aplica:A expansão de chaves ocorre antes da expansão variável, portanto, as chaves atribuídas a
$v
não são expandidas.Mas você pode fazer coisas assim:
A expansão
$(echo ...)
deve funcionar se você não tiver nenhum espaço em branco na string a ser expandida e, portanto, não terá problemas com a divisão de palavras. Uma maneira melhor pode ser usar uma variável de matriz, se puder.por exemplo, salve a expansão em uma matriz e execute algum comando com os valores expandidos:
fonte
Um ponto interessante. Possivelmente útil é o seguinte trecho de
man bash
:Observe que a expansão do suporte NÃO é mencionada na lista.
No entanto, isso ainda deixa uma pergunta, a saber: como o shell sabe que essa é uma atribuição variável e, portanto, não está sujeita à expansão de chaves? Ou, mais precisamente, onde a sequência de análise é esclarecida e codificada de modo que o shell seja definido para identificar atribuições de variáveis antes de lidar com a expansão de chaves? (Obviamente, é assim que
bash
funciona, mas não encontrei a linha exata de documentação que descreve isso.)fonte
LESS=+/SIMPLE man bash
).de acordo com meu conhecimento, o {a, b, c} é expandido quando ecoado diretamente ou usado com um comando, por exemplo: mkdir ~ / {a, b, c}, mas quando definido como uma variável, deve ser avaliado antes ecoando ou usando-o como argumento!
como você tem "a" seguido de "b" na ordem alfabética [az] e "1" seguido de "2" na ordem dec [0-9]: você pode usar o período duplo ".." com vírgula ", "
fonte
v
não foi definida como a string literal "a-1 a-2 b-1 b-2". Ou pelo menos por que nenhum erro foi gerado se você digitar o comando:v=a-1 v=a-2 v=b-1 v=b-2
(no qual você esperaria que a atribuição de variável fosse expandida). É uma boa pergunta; isso realmente não responde.A atribuição a uma variável no bash não expande a expressão.
Para este pequeno script, x conterá
"*"
e não a expansão de"*"
:No entanto, alguns valores são expandidos, ref. a boa resposta de ilkkachu.
Expressões são expandidas quando são avaliadas.
Como isso:
Ou assim:
Ou assim:
O acionamento
$()
é bastante comum e acho que é preferíveleval
, mas o melhor é provavelmente não acionar a avaliação, até que a variável seja realmente usada em um comando.fonte