Bash のマニュアルには次のように書かれています。
[[ と共に使用すると、< および > 演算子は現在のロケールを使用して辞書順でソートされます。test コマンドは、ASCII 順序を使用してソートします。
これは、それぞれ strcoll(3) または strcmp(3) を使用することになります。
これをテストするには、次のプログラム (strcoll_strcmp.c) を使用します。
#include <stdio.h>
#include <string.h>
#include <locale.h>
int main(int argc, char **argv)
{
setlocale(LC_ALL, "");
if (argc != 3) {
fprintf(stderr, "Usage: %s str1 str2\n", argv[0]);
return 1;
}
printf("strcoll('%s', '%s'): %d\n",
argv[1], argv[2], strcoll(argv[1], argv[2]));
printf("strcmp('%s', '%s'): %d\n",
argv[1], argv[2], strcmp(argv[1], argv[2]));
return 0;
}
違いに注意してください。
$ LC_ALL=C ./strcoll_strcmp ' a' '0a'
strcoll(' a', '0a'): -16
strcmp(' a', '0a'): -16
$ LC_ALL=en_US.UTF-8 ./strcoll_strcmp ' a' '0a'
strcoll(' a', '0a'): 10
strcmp(' a', '0a'): -16
なぜこれらがそのように比較されるのか、正確にはわかりません。これは、英語の辞書編集規則によるものに違いありません。正確なルールはISO 14651 Method for comparison character strings と共通テンプレートの調整可能な順序付けの説明とそれに付随するテンプレート テーブルに記載されていると思います。glibc には、 の下のソース ツリーにこのデータが含まれていますlibc/localedata/locales
。