bash: Я сломал ]
Я писал сценарий bash, и внезапно это поведение началось:
[[ 1 < 2 ]]; echo $? # outputs 0 [[ 2 < 13 ]]; echo $? # outputs 1
но -lt
работает -lt
:
- (test -n $ st)! = (test -z $ st) право?
- Bash [[соответствие шаблону не работает
- никогда не используйте оператор `-a` или` -o` с `[`
- Разница между ] и ]?
- Я хочу сравнить два списка и распечатать вывод разности из списка 1
[[ 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. Я не знаю, какая другая информация здесь актуальна.
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