我刚读到下面这句话:
区分大小写是 Linux 文件系统的功能,而不是 Linux 操作系统。
我从这句话中推断出的是,如果我在 Linux 机器上,但我正在使用使用 Windows 文件系统格式化的设备,那么区分大小写就不是一回事了。
我尝试了以下方法来验证这一点:
$ ~/Documents: mkdir Test temp
$ ~/Documents: touch Test/a.txt temp/b.txt
$ ~/Documents: ls te*
b.txt
Run Code Online (Sandbox Code Playgroud)
它只列出了 temp
目录中,这是预期的,因为我在 Linux 文件系统中。
当我导航到 Windows 文件系统时(注意:我使用的是 WSL2),我仍然得到相同的结果,但我希望它列出两个目录中的文件而忽略区分大小写。
$ /mnt/d: mkdir Test temp
$ /mnt/d: touch Test/a.txt temp/b.txt
$ /mnt/d: ls te*
b.txt
Run Code Online (Sandbox Code Playgroud)
我用 bash 和 zsh 都试过了。
我觉得它与 bash(或 zsh)有某种关系,因为我也读到 bash 强制区分大小写,即使在使用不区分大小写的文件系统时也是如此。
此测试适用于 Powershell,因此这意味着文件系统确实不区分大小写。
所以,我有一个简单的嵌套循环,其中外部for
循环遍历目录中的所有文件,内部for
循环遍历这些文件名的所有字符。
#!/bin/bash
if [ $# -lt 1 ]
then
echo "Please provide an argument"
exit
fi
for file in `ls $1`
do
for ch in $file
do
echo $ch
done
done
Run Code Online (Sandbox Code Playgroud)
上面的脚本不起作用。内部循环不会遍历文件名中的所有字符,而是遍历整个内容。
更新:
根据@ilkkachu 的回答,我想出了以下脚本,并且按预期工作。但是我很好奇我们可以不使用for...in
循环来迭代字符串吗?
#!/bin/bash
if [ $# -lt 1 ]
then
echo "Please provide an argument"
exit
fi
for file in `ls $1`; do
for ((i=0; i<${#file}; i++)); do
printf "%q\n" "${file:i:1}"
done
done
Run Code Online (Sandbox Code Playgroud)