Expansão variável (o termo padrão é expansão de parâmetro , e também é às vezes chamado de substituição de variável ) basicamente significa substituir a variável pelo seu valor . Mais precisamente, isso significa substituir a construção $VARIABLE
(ou ${VARIABLE}
ou ${VARIABLE#TEXT}
ou outras construções) por algum outro texto construído a partir do valor da variável. Este outro texto é a expansão da variável.
O processo de expansão é o seguinte. (Eu apenas discuto o caso comum, algumas configurações de shell e extensões modificam o comportamento).
- Pegue o valor da variável, que é uma string. Se a variável não estiver definida, use a string vazia.
- Se a construção incluir uma transformação, aplique-a. Por exemplo, se a construção for
${VARIABLE#TEXT}
e o valor da variável começar comTEXT
, removaTEXT
do início do valor. - Se o contexto exigir uma única palavra (por exemplo, entre aspas duplas ou no lado direito de uma atribuição ou dentro de um documento aqui), pare aqui. Caso contrário, continue com as próximas etapas.
-
Divida o valor em palavras separadas em cada sequência de espaço em branco. (A variável
IFS
pode ser alterada para dividir em caracteres diferentes de espaço em branco.) O resultado não é mais uma string, mas uma lista de strings. Esta lista pode estar vazia se o valor contiver apenas espaço em branco. - Trate cada elemento da lista como um padrão curinga de nome de arquivo, ou seja, um glob Se o padrão corresponder a alguns arquivos, ele será substituído pela lista de nomes de arquivos correspondentes, caso contrário, ele será deixado em paz.
Por exemplo, suponha que a variável foo
contenha a* b* c*
e o diretório atual contenha os arquivos bar
, baz
e paz
. Então, ${foo#??}
é expandido da seguinte forma:
- O valor da variável é a string de 8 caracteres
a* b* c*
. -
#??
significa remover os dois primeiros caracteres, resultando na string de 6 caracteresb* c*
(com um espaço inicial). - Se a expansão estiver em um contexto de lista (ou seja, sem aspas duplas ou outro contexto semelhante), continue.
- Divida a sequência em palavras delimitadas por espaços em branco, resultando em uma lista de duas sequências:
b*
ec*
. - A string
b*
, interpretada como um padrão, corresponde a dois arquivos:bar
ebaz
. A stringc*
não corresponde a nenhum arquivo, portanto, é deixada em paz. O resultado é uma lista de três strings:bar
,baz
,c*
.
Por exemplo, echo ${foo#??}
imprime bar baz c*
(o comando echo
une seus argumentos com um espaço entre eles).
Para mais detalhes, consulte: