让 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 nocaseglob
、shopt -s nocasematch
)的 全局 影响。通常,为避免以下任何 shell 命令/脚本出现意外行为,您必须恢复这些选项的初始状态。使用 shopt 选项 检查并存储初始状态,以便稍后恢复。
如何让 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 nocaseglob
、shopt -s nocasematch
)的 全局 影响。通常,为避免以下任何 shell 命令/脚本出现意外行为,您必须恢复这些选项的初始状态。使用 shopt 选项 检查并存储初始状态,以便稍后恢复。