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