shell command 'var = “[a-p]”; echo $ var 'tem como saída' h ', alguma explicação? [duplicado]

2

versão bash:

$ bash -version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

comando:

$ var="[a-p]"; echo $var
h

Alguém tem uma ideia do motivo para esse tipo de interpretação.

Para o contexto, estou analisando um arquivo de configuração usando o shell e procurando por padrões para capturar nomes de seções

[section-foo]
foo=bar

durante a leitura do arquivo, se uma linha de seção, por exemplo, for [a-p], terá esse comportamento estranho.

    
por Amine Chikhaoui 19.03.2017 / 22:36

2 respostas

6

Você tem um nome de arquivo h no diretório em que você executou

echo $var

O shell tenta usar [a-p] como glob e, se houver alguma correspondência, ele substitui o glob pela correspondência. Com um arquivo chamado h , isso se torna

echo h

Você pode evitar isso citando a expansão, o que fará com que ela não seja tratada como glob.

echo "$var"
    
por 19.03.2017 / 22:52
3

Por não usar qualquer citação em echo $var , você está expondo a expansão para "splitting" e "pathname expansion" (também conhecido como "globbing" ou "filename generation").

Isso significa que uma string que contenha [ (também * e ? ) será expandida pelas regras de "expansão do nome do caminho". No seu caso, isso significa que existe um arquivo com um nome de apenas um caractere chamado h .

Se você citar a expansão, nenhuma "Expansão de nome de caminho" será executada:

$ echo "$var"
[a-p]
    
por 19.03.2017 / 22:49