Bash [[correspondência de padrões não funciona

2

A seção de referência do Bash sobre construções condicionais diz:

When the ‘==’ and ‘!=’ operators are used, the string to the right of the 
operator is considered a pattern and matched according to the rules described 
below in Pattern Matching, as if the extglob shell option were enabled. ...
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 regex 
3)). 

Mas então eu tento isso:

$ [[ -good == -* ]] ; echo $?
0
$ [[ -g == -* ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near '-*'
$ [[ -g == -? ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near '-?'

Então, tento o operador de correspondência regex =~ :

$ [[ -good =~ -.* ]] ; echo $?
0
$ [[ -g =~ -.* ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near '-.*'
$ [[ -g =~ -.? ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near '-.?'

Por que os erros de sintaxe?

    
por jamadagni 13.10.2015 / 04:41

2 respostas

4

Bem, você precisa ter cuidado para que o texto à esquerda de == , =~ ou != não seja um dos operadores reconhecidos nas expressões condicionais Bash .

No seu caso, -g testa um conjunto de bits setgid . Se você tivesse fornecido algo que não é reconhecido como operador nesse contexto, funcionaria:

$ [[ -i == -* ]] ; echo $?
0
$ [[ -i == -? ]] ; echo $?
0
$ [[ -i =~ -.* ]] ; echo $?
0
$ [[ -i =~ -.? ]] ; echo $?
0

Uma forma de fornecer de forma confiável qualquer string seria citá-la, por isso ela é reconhecida não como um operador, mas como apenas uma string:

$ [[ "-good" == -* ]] ; echo $?
0
$ [[ "-g" == -* ]] ; echo $?
0
$ [[ "-g" == -? ]] ; echo $?
0
$ [[ "-good" =~ -.* ]] ; echo $?
0
$ [[ "-g" =~ -.* ]] ; echo $?
0
$ [[ "-g" =~ -.? ]] ; echo $?
0

No entanto, tenha cuidado para não citar o lado direito do operador, pois isso evitará que ele seja reconhecido como um padrão:

$ [[ "-good" == "-*" ]] ; echo $?
1
$ [[ "-g" == "-*" ]] ; echo $?
1
$ [[ "-g" == "-?" ]] ; echo $?
1
$ [[ "-good" =~ "-.*" ]] ; echo $?
1
$ [[ "-g" =~ "-.*" ]] ; echo $?
1
$ [[ "-g" =~ "-.?" ]] ; echo $?
1
    
por 13.10.2015 / 04:41
0

Devemos colocar a string dentro de aspas para avaliá-las como strings. Se tentarmos avaliar uma string com hífen embutido (-), o shell considerará como uma opção para testar, mas não como string. Para obter mais informações sobre os operadores, você pode verificar este aqui

    
por 13.10.2015 / 06:33