bash: Eu quebrei [[]]

14

Eu estava escrevendo um script e de repente esse comportamento começou:

[[ 1 < 2 ]]; echo $?  # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1

mas -lt funciona bem:

[[ 1 -lt 2 ]]; echo $?  # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0

eu acidentalmente gravei < de alguma forma?

aqui está um script que eu escrevi para testar esse comportamento:

#!/bin/bash

for a in {1..5}
do
    for b in {1..20}
    do
        [[ $a < $b ]] && echo $a $b
    done

    echo
done

aqui está a saída:

1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20

2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 20

3 4
3 5
3 6
3 7
3 8
3 9

4 5
4 6
4 7
4 8
4 9

5 6
5 7
5 8
5 9

alterando < para -lt no script dá saída normal ( 5 10 aparece por exemplo).

A reinicialização não mudou nada.

Minha versão bash é GNU bash, versão 4.3.42 (1) -release (x86_64-pc-linux-gnu). Eu estou no Ubuntu 15.10. Não sei que outras informações são relevantes aqui.

    
por snail-on-a-quest 31.05.2016 / 20:43

3 respostas

51

Da página bash man.

When used with [[, the < and > operators sort lexicographically using the current locale.

A partir da saída, parece estar funcionando como projetado.

    
por 31.05.2016 / 20:53
6

Que tal:

for a in {1..5}; 
do     
  for b in {1..20};     
  do         
    (( $a < $b )) && echo $a $b
  done      
  echo
done

De acordo com o link

Similar to the let command, the (( ... )) construct permits arithmetic expansion and evaluation. In its simplest form, a=$(( 5 + 3 )) would set a to 5 + 3, or 8. However, this double-parentheses construct is also a mechanism for allowing C-style manipulation of variables in Bash, for example, (( var++ )).

    
por 31.05.2016 / 21:56
3

Em primeiro lugar, [[ não é POSIX e deve ser evitado.

Em segundo lugar, se você quiser usar < como parte de um teste aritmético, você pode fazer isso, mas com sintaxe diferente:

if [ $((2 < 13)) = 1 ]
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi

Ou:

if expr 2 '<' 13
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi
    
por 02.06.2016 / 02:31

Tags