使用case
更清洁:
case $d in
/mnt/foo/gbl/*|/mnt/bar/publish/gbl/*|/opt/sasu/bar/publish/gbl/*)
rm -fr "$d"
esac
..日常使用。这是 POSIX 兼容且快速的。
如果你想把它变成一个函数,你可以这样做:
# prefixed_by "$locn" "$safe_pfx" '/dir/list'
prefixed_by() {
[ -n "$1" ] || return
local i f=$1; shift
for i; do
i=${i%/}
case $f in
"$i/"*) return 0
esac
done
return 1
}
因此,如果您知道列表中从来没有空格或通配符(即:它直接在您的脚本中使用字符串文字设置),您可以这样做:
readonly safe_list='/mnt/foo/gbl /mnt/bar/publish/gbl /opt/sasu/bar/publish/gbl'
..在初始化中,然后是:
prefixed_by "$d" $safe_list && rm -fr "$d"
我在函数中使用local
了该函数,虽然大多数现代 shell 都有它,但它在 POSIX 中没有指定:您可以更改它以适应您的情况,因为其余的都是符合 POSIX 的。
在 BASH 中,您不必case
在for
循环中使用:您可以只使用[[
which 模式匹配,即:
[[ $f = "$i"/* ]] && return
它也不会分词,也不会执行任何文件名扩展。但是,需要引用"$i"
以确保任何通配符(如*
或?
不用作通配符)。