条件表达式如何比较字符串?

upd*_*liu 7 bash

#!/usr/bin/env bash
echo 'Using conditional expression:'
[[ ' ' < '0' ]] && echo ok || echo not ok
[[ ' a' < '0a' ]] && echo ok || echo not ok
echo 'Using test:'
[ ' ' \< '0' ] && echo ok || echo not ok
[ ' a' \< '0a' ] && echo ok || echo not ok
Run Code Online (Sandbox Code Playgroud)

输出是:

Using conditional expression:
ok
not ok
Using test:
ok
ok
Run Code Online (Sandbox Code Playgroud)

bash --version: GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)

uname -a: Linux linuxmint 3.8.0-19-generic

spb*_*ick 5

Bash手册说:

与[[,<和>运算符一起使用时,使用当前语言环境按字典顺序排序.测试命令使用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;
}
Run Code Online (Sandbox Code Playgroud)

注意区别:

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

究竟为什么这些比较,我不确定.这必须归功于一些英语词典排序规则.我认为在ISO 14651方法中描述了确切的规则,用于比较字符串和公共模板可定制排序的描述以及随附的模板表.Glibc在源树下包含此数据libc/localedata/locales.