使用条件运算符时的排序顺序是什么?

Pao*_*olo 5 bash shell-script sort wildcards

我编写了一个 bash 脚本来处理文件名列表(使用 glob 扩展,如for f in *),然后将该列表的一个子集输出到文件中。随后,我将这个文件的内容读入一个数组,并使用明显的<>运算符来比较字符串,对特定文件名执行简单的二进制搜索。

考虑到我希望脚本能够在 Linux、MacOS、MinGW 等许多不同的环境中工作……(即使它使用诸如[[stat不太便携的东西),我的问题是:

  1. 我是否需要对文件内容进行排序(使用sort或额外的 bash 代码)或者 glob 扩展是否总是排序 - 在每个环境中?
  2. 条件运算符是否使用与扩展(或之后sort)相同的“排序” ?

    扩展或sort返回file10.txt之后file2.txt(在什么情况下?)但使用条件运算符file10.txt会在之前file2.txt?我sort会用什么选项来解决这个问题?

  3. 如果我的某些文件名是 Unicode,有什么注意事项吗?

  4. 使用特定版本的 bash 是否有任何问题?
  5. 是否LC_COLLATE影响上述任何一项?

我显然需要文件内容来匹配运算符的排序“方法”,以便二分搜索按预期工作......

小智 3

是的,全局扩展总是经过排序的。
\n在 bash 中(来自LESS=+/\'^ *Pathname Expansion\' man bash

\n\n
\n

路径名扩展\n ... 该单词被视为一种模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。

\n
\n\n

这也是由 POSIX glob 指定的

\n\n
\n

...路径名按 LC_COLLATE 类别的当前设置定义的排序顺序排列。

\n
\n\n

注1:除非GLOB_NOSORT设置了标志。在这种情况下,顺序是未指定的。

\n\n

注2:排序顺序为字母顺序(不是数字),10 排在 2 之前。

\n\n
\n\n

答案:

\n\n
\n
    \n
  1. 我是否需要对文件内容进行排序(使用排序或附加 bash 代码)...
  2. \n
\n
\n\n

Globing 与文件内容无关,仅适用于文件名。
\n如果您需要对“文件内容”进行排序,那么,是的,您确实需要调用sortuse 相当多的bash代码。

\n\n
\n
    \n
  1. ...或者全局扩展总是排序的 - 在每个环境中?
  2. \n
\n
\n\n

除非禁用,否则GLOB_NOSORTGlobing 的结果将LC_COLLATE按照环境中排序顺序(变量)定义的顺序进行排序。

\n\n

要具有相同的排序顺序,您必须具有相同的有效排序规则。两者都设置LC_COLLATE变量并具有locale包含相同整理详细信息的描述。

\n\n
\n
    \n
  1. 条件运算符是否使用与扩展(或排序后)相同的“排序”?
  2. \n
\n
\n\n

是的。两者都受到相同的影响LC_COLLATE

\n\n
\n
    \n
  1. 扩展或排序是否会在 file2.txt 之后返回 file10.txt (在什么情况下?),但使用条件运算符 file10.txt 将在 file2.txt 之前?我将使用什么排序选项来解决这个问题?
  2. \n
\n
\n\n

10before的结果2是“字典顺序”,与 bash 手册描述中所谓的“字母顺序”相同。因此,如果您使用 bash(或任何 POSIX shell)进行排序,这就是您将得到的顺序(在所有情况下)。这没有错,所以它是不可修复的(对于文本)。

\n\n

但是,如果您选择使用sort(外壳外部的外部工具),您可能会要求numeric排序(-n 选项),它将2放在10. 或者您可以从文本中提取数字并使用它们-lt -gt在 shell 中进行整数比较(整数运算符)。

\n\n
\n

如果我的某些文件名采用 Unicode,有什么注意事项吗?

\n
\n\n

主要是:整理顺序不固定。

\n\n

它随时间和 UNICODE 版本而变化。

\n\n

可能发生的情况是,您用某种您不熟悉的语言得到一些令人惊讶的结果。例如:

\n\n

“aa”将匹配丹麦语中的“\xc3\xa5”

\n\n

简而言之:\xc2\xbb 准备好感到惊讶\xc2\xab。

\n\n
\n

使用特定版本的 bash 是否存在任何问题?

\n
\n\n

嗯,你必须使用2.0以上的bash版本

\n\n
respect LC_COLLATE  2.0 \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

LC_COLLATE 会影响上述任何一个吗?

\n
\n\n

该变量LC_COLLATE影响上述所有内容。

\n