Использование 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
в функции, которая не указана в POSIX, хотя в большинстве современных оболочек она есть: вы можете изменить это в соответствии с вашими обстоятельствами, так как остальное полностью соответствует POSIX.
В BASH вам не нужно использовать case
в цикле for
: вы можете просто использовать [[
, какой шаблон соответствует, то есть:
[[ $f = "$i"/* ]] && return
Он также не разделяет слова и не выполняет расширение имени файла. Кавычки "$i"
необходимы, однако, чтобы любые символы подстановки, такие как *
или ?
, не использовались как символы подстановки.