bash: Я сломал ]

Я писал сценарий bash, и внезапно это поведение началось:

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

но -lt работает -lt :

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

я случайно перезаписал < как-то?

вот сценарий, который я написал, чтобы проверить это поведение:

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

вот результат:

 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 

изменение < to -lt в скрипте дает нормальный выход (например, 5 10 ).

Перезагрузка ничего не изменила.

Моя версия bash – GNU bash, версия 4.3.42 (1) -release (x86_64-pc-linux-gnu). Я на Ubuntu 15.10. Я не знаю, какая другая информация здесь актуальна.

  • никогда не используйте оператор `-a` или` -o` с `[`
  • Как проверить список прокси-серверов?
  • Начиная с bash: -lt и -gt аргументы
  • В чем смысл & amp в отношении тестовой команды?
  • Если утверждение, дающее ответ «else» для обоих результатов cmp
  • Трейлинг двоеточий и встроенная тестовая команда
  • Использование команды test для создания каталога, если он не существует
  • sh AND и OR в одной команде
  • 3 Solutions collect form web for “bash: Я сломал ]”

    На странице man bash .

    При использовании с [[, операторы <и> сортируют лексикографически с использованием текущей локали.

    На выходе он работает как сконструированный.

    Как насчет:

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

    Согласно http://www.tldp.org/LDP/abs/html/dblparens.html

    Подобно команде let, конструкция ((…)) допускает арифметическое расширение и оценку. В своей простейшей форме a = $ ((5 + 3)) установит значение 5 + 3 или 8. Однако эта конструкция с двойными скобками также является механизмом для разрешения манипуляций с C-типами переменных в Bash, например , ((var ++)).

    Во-первых, [[ не является POSIX и его следует избегать).

    Во-вторых, если вы хотите использовать < как часть арифметического теста, вы можете это сделать, но с другим синтаксисом:

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

    Или:

     if expr 2 '<' 13 then echo '2 is less than 13' else echo '2 is greater or equal to 13' fi 
    Linux и Unix - лучшая ОС в мире.