30213


ある文字列とある文字列が、辞書順で大きいのか小さいのかを判定したいです。  
どうしたら実現できるでしょうか。

知っていること: bash では `[[ $str1 < $str2 ]]` で判定できるのは知っているのですが、  
これは bash の拡張構文であると思っていて、 `sh` ではどう行うのだろうと疑問に思っているので、質問しています。


CC BY-SA 3.0
2016-11-08T06:46:44.313
30205
2016-11-09T09:17:44.177
754
question
sh
ある文字列とある文字列を辞書順での順序を判定したい


(POSIX) sh の組み込み関数には、文字列の大小比較ができるものは存在しないので、そのような場合、一般的には `expr` コマンドを使います。

[code]

    expr "$str1" "<" "$str2" > /dev/null
    
[/code]

しかし組み込み関数ではないために、上記のように `<` や `>`
をいちいちクォートするかエスケープしなければならなく、あまり見た目がよろしくないので、あまり積極的には使われないと思います。

文字列比較が必要になった時点で、sed, AWK, Perl, Python, Ruby といったスクリプト言語を使うケースが多いと思います。


CC BY-SA 3.0
2016-11-08T07:15:30.470
30206
2016-11-08T21:37:31.300
2016-11-08T21:37:31.300
2521
2521
30205
answer


`sort`のcheckオプションとか

[code]

    ( echo "$str1"; echo "$str2" ) | sort -C
    
[/code]

EDIT: strcmp.sh

同じ文字列の場合はもちろん`=`が使えるので、移植性考えながら`strcmp`モドキを作るならこんな感じでしょうか。

[code]

    #!/bin/sh
    
    [ -z ${1+x} ] && exit 1
    [ -z ${2+x} ] && exit 1
    [ "$1" = "$2" ] && printf "%d\n" 0 && exit 0
    printf "%s\n%s\n" "$1" "$2" | sort -C \
        && printf "%d\n" -1 \
        || printf "%d\n" 1
    
[/code]


CC BY-SA 3.0
2016-11-08T11:00:51.667
30213
2016-11-09T09:17:44.177
2016-11-09T09:17:44.177
62
62
30205
answer