Por que a divisão de palavras e a expansão de nomes de texto não se aplicam à expressão condicional em '[[…]]'?

0

Do manual de referência do bash

Regra da seção "Divisão de palavras":

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

Regra da seção Expansão de nome de arquivo:

After word splitting, unless the -f option has been set (see Section 4.3.1 [The Set Builtin], page 58), Bash scans each word for the characters ‘*’, ‘?’, and ‘[’. If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of filenames matching the pattern

Portanto, após a expansão de parâmetros, a substituição de comandos e a aritmética expansão, a divisão de palavras acontece a menos que nas partes entre aspas duplas.

  1. Em [[ ... ]] , Giles e John1024 ambos disseram que a palavra a divisão e expansão de nome de arquivo não se aplicam à condicional expressão dentro de [[ ... ]] . Quais regras na Referência de Bash Manual ou POSIX 7 Especificações governam isso?

    • A expressão condicional em [[ ... ]] não é cotada em dobro, então por que a divisão de palavras não se aplica?

    • A opção -f não está definida. Por que a expansão de nome de arquivo também não se aplica?

  2. Além de [[ ... ]] , há outros casos em que a divisão de palavras expansão de nome de arquivo ou ambos não se aplicam? São suas razões que um ou ambos os dois não se aplicam o mesmo que [[..]] ?

  3. A divisão de palavras e o expansão de nomes de arquivos sempre andam de mãos dadas, no sentido de que ambos se aplicam ou ambos não se aplicam a cada caso?

por Tim 16.03.2016 / 22:18

2 respostas

5

Na documentação do comando [[ , você veja

Word splitting and filename expansion are not performed on the words between the [[ and ]]; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and quote removal are performed.

(ênfase minha)

Além disso, a case declaração tem isenções

The word undergoes tilde expansion, parameter expansion, command substitution, arithmetic expansion, and quote removal before matching is attempted. Each pattern undergoes tilde expansion, parameter expansion, command substitution, and arithmetic expansion.

Notáveis por sua ausência são a divisão de palavras e a expansão de nomes de arquivos.

Além disso, a atribuição de variáveis (consulte Parâmetros da shell )

A variable may be assigned to by a statement of the form

name=[value]

     

Se valor não for fornecido, a variável será atribuída à cadeia nula. Todos os valores passam por expansão de til, expansão de parâmetro e variável, substituição de comando, expansão aritmética e remoção de cotação

Então, isso é seguro:

a="hello world"
b=$a

Outros locais onde a divisão de palavras não é realizada:

Meu truque: pesquise a palavra "sofrer" no manual do bash.

    
por 16.03.2016 / 22:31
2

As palavras dentro de [[ e ]] são uma extensão, que o bash usa (entre outras coisas) para fornecer expressões regulares:

An additional binary operator, ‘=~’, is available, with the same precedence as ‘==’ and ‘!=’. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex3)).

Executar expansão de nome de arquivo em uma expressão regular não seria útil, pois ambos usam os mesmos meta caracteres * e ? para finalidades diferentes.

Leitura adicional:

por 16.03.2016 / 22:29

Tags