<(より小さい)がbash [[]]で-ltと異なる結果を提供するのはなぜですか?

<(より小さい)がbash [[]]で-ltと異なる結果を提供するのはなぜですか?

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

スクリプトでこれを変更すると、<通常の出力(ディスプレイなど)が表示されます。-lt5 10

再起動しても何も変わりませんでした。

私のbashバージョンはGNU bashバージョン4.3.42(1)-release(x86_64-pc-linux-gnu)です。 Ubuntu 15.10を使用しています。ここで何が関連しているのかわかりません。

答え1

bashマンページから。

[[とともに使用すると、<and>演算子は現在のロケールを使用してアルファベット順にソートします。

出力を見ると、設計どおりに動作するようです。

バッシュで使用:

  • [[ $a < $b ]]現在のロケールに基づく事前比較(使用strcoll(3)
  • [ "$a" -lt "$b" ]10進整数の比較に使用されます。
  • (( a < b ))または[[ $a -lt $b ]]算術式の比較のため。$a算術式が保存され評価されている間に任意のコマンドを実行するなどの$b副作用がある可能性があります。たとえば、システムをx=5 a='++x' bash -c '[[ $a -lt $a ]]; echo "$? $x"'エクスポートして0 7再起動します(2回)。a='x[$(reboot)]' b=a bash -c '[[ $a -lt $b ]]'また、ゼロで始まる数字は、10進数ではなく8進数として解釈されます。

答え2

どうですか?

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 ++)))。

答え3

まず、[[ POSIXではない避けるべきです。

<次に、算術テストの一部として使用するには、次のように別の構文を使用します。

if [ "$((2 < 13))" -ne 0 ]
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

関連情報