bash: J'ai cassé ]

J'écrivais un script bash et soudainement ce comportement a commencé:

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

mais -lt fonctionne bien:

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

ai-je accidentellement écrasé < quelque sorte?

voici un script que j'ai écrit pour tester ce comportement:

 #!/bin/bash for a in {1..5} do for b in {1..20} do [[ $a < $b ]] && echo $a $b done echo done 

voici la sortie:

 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 

changer < to -lt dans le script donne une sortie normale ( 5 10 apparaît par exemple).

Le redémarrage n'a rien changé.

Ma version bash est GNU bash, version 4.3.42 (1) -release (x86_64-pc-linux-gnu). Je suis sur Ubuntu 15.10. Je ne sais pas quelles autres informations sont pertinentes ici.

De la page de bash man.

Lorsqu'ils sont utilisés avec [[, les opérateurs <et> sortingent lexicographiquement en utilisant les parameters régionaux actuels.

De la sortie, il semble fonctionner comme prévu.

Que diriez-vous:

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

Selon http://www.tldp.org/LDP/abs/html/dblparens.html

Similaire à la command let, la construction (()) permet l'expansion et l'évaluation arithmétiques. Dans sa forme la plus simple, a = $ ((5 + 3)) mettrait a à 5 + 3 ou 8. Cependant, cette construction entre parenthèses est aussi un mécanisme permettant de manipuler des variables dans Bash, par exemple , ((var ++)).

Premièrement, [[ n'est pas POSIX et doit être évité.

Deuxièmement, si vous souhaitez utiliser < dans le cadre d'un test arithmétique, vous pouvez le faire, mais avec une syntaxe différente:

 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