![为什么脚本列出的目录首先以大写字母开头,然后以全小写字母开头?](https://linux22.com/image/1099658/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%84%9A%E6%9C%AC%E5%88%97%E5%87%BA%E7%9A%84%E7%9B%AE%E5%BD%95%E9%A6%96%E5%85%88%E4%BB%A5%E5%A4%A7%E5%86%99%E5%AD%97%E6%AF%8D%E5%BC%80%E5%A4%B4%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BB%A5%E5%85%A8%E5%B0%8F%E5%86%99%E5%AD%97%E6%AF%8D%E5%BC%80%E5%A4%B4%EF%BC%9F.png)
该线程是以下内容的扩展:列出目录的基本脚本([:发现:意外操作符)
当我执行脚本时:
for item in *
do
if [ -d "$item" ]
then
echo "$item"
fi
done
它列出了系统安装过程中自动组装的文件夹(桌面、文档、下载)或自动安装的应用程序(Dropbox),然后是我的(dosgames),而不是按字母顺序排列它们(桌面、文档、dosgames、下载、Dropbox)。
如果检查的是共同特征(-d),为什么它要运行两个单独的检查?
输出:
Dokumenty
Dropbox
Muzyka
Obrazy
Pobrane
Publiczny
Pulpit
Szablony
Wideo
dosgames
learning_linux
new
tset
我使用的是波兰语版本,因此目录名称如此。然而,这些都是默认系统目录,如果不是,显然不是(即 Dropbox、dosgames)
答案1
shell 根据区域设置您已设置。具体来说,它是LC_COLLATE
控制字符串排序方式的变量。就您而言,它会像在POSIX
或C
语言环境中一样先对大写字符进行排序,然后再对小写字符进行排序(即按字符的 ascii 值排序)。
$ mkdir Dokumenty dosgames Dropbox Muzyka learning_linux
$ LC_COLLATE=en_US.utf-8; echo */
Dokumenty/ dosgames/ Dropbox/ learning_linux/ Muzyka/
$ LC_COLLATE=C; echo */
Dokumenty/ Dropbox/ Muzyka/ dosgames/ learning_linux/