bash:我打破了 [[ < ]]

sna*_*est 14 bash test

我正在编写一个 bash 脚本,突然这种行为开始了:

[[ 1 < 2 ]]; echo $?  # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1
Run Code Online (Sandbox Code Playgroud)

-lt运行良好:

[[ 1 -lt 2 ]]; echo $?  # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0
Run Code Online (Sandbox Code Playgroud)

我不小心<以某种方式覆盖了吗?

这是我编写的用于测试此行为的脚本:

#!/bin/bash

for a in {1..5}
do
    for b in {1..20}
    do
        [[ $a < $b ]] && echo $a $b
    done

    echo
done
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

在脚本中更改<-lt提供正常输出(5 10例如显示)。

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

我的 bash 版本是 GNU bash,版本 4.3.42(1)-release (x86_64-pc-linux-gnu)。我在 Ubuntu 15.10 上。我不知道这里还有哪些相关信息。

ste*_*eve 51

bash手册页。

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

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

  • 换句话说,在你认为你发现了一个错误之前**阅读手册页**。;) (35认同)
  • @Wildcard OP 并不认为他们发现了错误。他们明确表示,也许他们已经做了一些改变行为的事情。甚至标题也假设了很多! (14认同)
  • 不,不要更改问题的标题。此答案旁边的复选标记足以表明问题已解决。 (2认同)

Pau*_*ker 5

怎么样:

for a in {1..5}; 
do     
  for b in {1..20};     
  do         
    (( $a < $b )) && echo $a $b
  done      
  echo
done
Run Code Online (Sandbox Code Playgroud)

根据http://www.tldp.org/LDP/abs/html/dblparens.html

与 let 命令类似, (( ... )) 结构允许算术展开和求值。在最简单的形式中, a=$(( 5 + 3 )) 会将 a 设置为 5 + 3 或 8。但是,这种双括号结构也是一种允许在 Bash 中进行 C 风格变量操作的机制,例如, ((var++))。

  • 这已经回答了。但是当他想使用算术表达式时,可能值得指出的是,存在允许您在 shell 中使用它们的构造。 (7认同)
  • 您错过了问题的重点 - 这不是“我如何比较这些值?” 但是“为什么它的行为方式如此?”。 (2认同)