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. Я не знаю, какая другая информация здесь актуальна.

  • Конкретная строка зависает [, [[
  • Есть ли какая-либо существенная разница при сравнении переменной как строки или как int
  • Как написать функцию в bash?
  • (test -n $ st)! = (test -z $ st) право?
  • Разница между ] и ]?
  • Успешная команда командной строки Linux
  • Понимание перенаправленного if-утверждения в bash
  • В чем разница между «тестом» и оценкой с помощью / dev / null?
  • 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 
    Interesting Posts

    проверьте, если сценарий оболочки принимает аргумент командной строки перед запуском

    Безопасно ли отключать пароль для пользователя, если он использует только SSH-ключ?

    В чем разница между стандартом Debian и Gnome?

    Сценарий оболочки Bash для удаления указателя в имени файла

    wmakerconf не создается, несмотря на то, что установлена ​​зависимость

    Как завершить завершенную установку Debian?

    bash_completion не работает в dtach

    Может ли 0-й физический ядро ​​использовать асимметрично в linux?

    Разбор JSON на оболочке

    pvscan –activate: `Команда не принимает параметр: –activate ay.`

    Список имен файлов в качестве аргумента для mplayer => mplayer не распознает имена файлов

    Ошибка аутентификации OpenVPN HMAC, несмотря на кажущиеся идентичные конфигурации клиента и сервера

    Получите необработанный ввод из командной строки (игнорируйте метасимволы оболочки)

    Настройка OpenWRT как ретранслятора

    sed – удаление нуля – / 08 / to / 8 /

    Linux и Unix - лучшая ОС в мире.