让 Bash 对测试执行不区分大小写的操作

To have Bash to do case insensitive operation on a test

如何让 Bash 在测试中进行不区分大小写的操作:

$ n=Foo
$ [ -e "$n" ] && echo $n exist

foo exist

如果是:

$ ls
foo   bar   baz

如何正确设置?

find中使用ipath

if tmp=$(find . -maxdepth 1 -ipath "./$n") && [[ -n "$tmp" ]]; then
   echo "$n exists and there are:" $tmp
fi

您还可以使用 bash 不区分大小写的全局匹配模式:

$ shopt -s nocaseglob
$ shopt -s nocasematch
$ n=Foo
$ f=("$n"*)
$ [ "${f[0]/$n/}" = "" ] && echo ${f[0]} exist
foo exist

但请注意,要进行条件测试匹配 模式 而不是直接使用 f=("$n"*) 的文件名,我们在这里使用 *。这样,如果 $n.

中存在 *? 等模式符号,您将得到错误的结果

您还必须仔细考虑 shell 选项(shopt -s nocaseglobshopt -s nocasematch)的 全局 影响。通常,为避免以下任何 shell 命令/脚本出现意外行为,您必须恢复这些选项的初始状态。使用 shopt 选项 检查并存储初始状态,以便稍后恢复。