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)-release(x86_64-pc-linux-gnu)です。私はUbuntu 15.10にいます。ここで関連する他の情報はわかりません。


16
<、一方の操作、あなたは文字列の比較を行っている、-ltオペレータが数値比較であるあなたが列挙されてきた結果を見れば、あなたはそれを実現します。数値的に2はアルファベット順で10未満で、逆の場合も同様です。
メルバースラン

回答:


51

bashmanページから。

[[とともに使用すると、<および>演算子は現在のロケールを使用して辞書式にソートされます。

出力から、設計どおりに機能しているように見えます。


35
つまり、バグを発見したと仮定する前に、manページを読んでください。;)
ワイルドカード

本当です。おそらく、私が最初に取り組んでいたスクリプトは、この動作に気付いたときに([[$ myvar <13]]に失敗したように)実際に「正しく」動作し始めたのでしょう。今、この質問に対してすべきことはありますか?このサイトでは、タイトルを[解決済み]などに変更していますか?とにかくタイトルをよりわかりやすいものに変更する必要がありますか?
カタツムリのクエスト

2
いいえ、質問のタイトルを変更しないでください。この回答の横にあるチェックマークは、質問が解決されたことを示すのに十分です。
saiarcot895

14
@Wildcard OPは、バグが見つかったとは想定していません。彼らは、おそらく行動を変えるために何かをしたことを明示的に示唆しています。タイトルでも同じくらい想定しています!
jpmc26

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
あなたは質問の要点を見逃しています-それは「どうやってそれらの値を比較できますか?」ではありません。しかし、「なぜそれが動作するのですか?」。
ガントバート

7
これはすでに回答済みです。しかし、算術式を使用したかったので、シェルで使用できる構造が存在することを指摘する価値があります。
-PaulSmecker

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.