Este post contém duas perguntas separadas, mas acho que agrupá-las dará mais contexto. Eu passei por essa pergunta entre aspas em torno de variáveis, mas não entendo bem o que significa expansão de variável em primeiro lugar. Então, minha primeira pergunta é:
- O que é expansão variável no unix / linux speak?
Uma segunda parte da minha pergunta está relacionada aos seguintes termos:
- glob
- Dividido
O que significa acima e como eles afetam a expansão variável? A resposta à pergunta original menciona o seguinte:
Pense na ausência de aspas (em contextos de lista) como o operador split + glob.
Como se echo $ test fosse echo glob (split ("$ test")).
Não consegui encontrar respostas que abordassem diretamente o conceito de globbing e split, mas usem esses termos diretamente para responder a outras perguntas como esta recente .
Respostas:
Expansão variável (o termo padrão é expansão de parâmetro e também é chamado de substituição de variável ) basicamente significa substituir a variável pelo seu valor. Mais precisamente, isso significa substituir a
$VARIABLE
construção (ou${VARIABLE}
ou${VARIABLE#TEXT}
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. (Apenas discuto o caso comum, algumas configurações e extensões do shell modificam o comportamento.)
${VARIABLE#TEXT}
e o valor da variável começa comTEXT
, removaTEXT
do início do valor.IFS
pode ser alterada para dividir em caracteres que não sejam espaços em branco.) Portanto, o resultado não é mais uma sequência, mas uma lista de sequências. Esta lista pode estar vazia se o valor contiver apenas espaço em branco.Por exemplo, suponha que a variável
foo
contéma* b* c*
eo diretório atual contém os arquivosbar
,baz
epaz
. Em seguida,${foo#??}
é expandido da seguinte forma:a* b* c*
.#??
significa remover os dois primeiros caracteres, resultando na sequência de 6 caracteresb* c*
(com um espaço inicial).b*
ec*
.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 cordas:bar
,baz
,c*
.Por exemplo,
echo ${foo#??}
impressõesbar baz c*
(o comandoecho
junta seus argumentos com um espaço no meio).Para mais detalhes, consulte:
fonte
$var
) e outros tipos de parâmetros como$1
,$#
,$?
,$-
...glob / split
Vou pegar o glob / split primeiro. A resposta de @ Stephane à qual você se vinculou é usar esses termos em um sentido geral. Eles não são comandos reais ou algo parecido, apenas pseudo-operações.
O
split("$test")
iria dividir o conteúdo de "$ test"-se em um "array" de elementos.Em
glob(...)
seguida, tomaríamos o cuidado de expandir qualquer um desses elementos que contenham caracteres globbing do shell, como*
intervalos[1-2]
.Exemplo
Digamos que nossa string
$test
é a seguinte.Também vamos dizer que temos um diretório com alguns arquivos nele.
Agora, se tentarmos repeti-lo sem aspas, você deve notar que nossa string foi dividida em espaços e, em seguida, quaisquer caracteres brilhantes foram expandidos.
No entanto, se citássemos a variável quando a passássemos como argumento
echo
, obteríamos a string literal original.expansão variável
O termo expansão variável destina-se a cobrir a operação básica que o shell está executando como parte de suas operações básicas. O shell é responsável por analisar a entrada e, em seguida, executá-la assim que for considerada sintaticamente correta.
No nosso exemplo anterior. Quando a variável
$test
foi apresentada entreecho
aspas, estávamos dizendo ao shell para seguir em frente e dividir esses argumentos e depois enviá-los.Quando foi citado, estávamos essencialmente desativando esse recurso com qualquer variável que envolvemos com aspas duplas.
Exemplo
Aqui estão alguns exemplos adicionais de globbing e split.
glob / splitting acontece automaticamente
glob / splitting desativado por aspas duplas
fonte