bash:我摔坏了[[<]]


14

我正在编写bash脚本,突然开始出现此行为:

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

-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

改变<-lt在脚本给正常输出(5 10示出了例如)。

重新启动并没有改变任何东西。

我的bash版本是GNU bash,版本4.3.42(1)-发行版(x86_64-pc-linux-gnu)。我在Ubuntu 15.10上。我不知道这里还有什么其他信息。


16
使用<运算-lt符,您将进行字符串比较,而运算符是数值比较,如果查看列出的结果,您将会意识到。从数字上看,数字2小于10,反之亦然。
MelBurslan '16

Answers:


51

bash手册页。

与[[一起使用时,<和>运算符使用当前语言环境按字典顺序排序。

从输出来看,它似乎正在按设计工作。


35
换句话说,在您假定已发现错误之前,请阅读手册页。;)
通配符

真正。当我注意到此行为时,也许我最初正在使用的脚本实际上开始“正确地”工作(如失败的[[$ myvar <13]])。我现在对这个问题有什么需要做的吗?我们在此站点上是否将标题更改为包括[已解决]或其他内容?是否应该将标题更改为更具描述性的名称?
snail-on-a-quest蜗牛于

2
不,请不要更改问题的标题。答案旁边的复选标记足以表明问题已解决。
saiarcot895 '16

14
@Wildcard OP并不认为他们发现了错误。他们明确暗示,也许他们已经做了一些改变行为的事情。甚至标题也一样!
jpmc26 2013年

5

怎么样:

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))会将a设置为5 + 3或8。但是,这种双括号结构也是一种允许对Bash中的变量进行C风格操作的机制。 ,((var ++))。


2
您遗漏了问题的要点-不是“我如何比较那些值?” 但是“为什么它会表现得如此?”。
贡伯特'16

7
已经回答了。但是,由于他想使用算术表达式,可能值得指出的是,存在允许您在shell中使用这些构造的构造。
PaulSmecker '16

3

首先,[[ 不是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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.