Как определить правильное окончание пути?
Я получил переменную оболочки, содержащую этот путь
/usr/share/man/man1/bitmap.1
Может быть файл с именем bitmap.1, но также может быть bitmap.1.z, bitmap.1.gz, bitmap.1.Z.
Теперь я хочу передать реальный файл функции, одновременно решая правильный файл, как
function process {
# do something
}
path="/usr/share/man/man1/bitmap.1"
process ${path}.(z|Z|gz) # here the shell shall resolve the real filename
Есть ли способ сделать это элегантно, или я должен проверить, если bitmap.1, bitmap.1.z и т. Д. Выйти и затем передать этот файл в функцию???
Не забудьте упомянуть, что я ограничен Bourne-Shell, так что никакого расширения Brace нет под рукой -,-.
4 ответа
Вы все еще можете делать сглаживание в Bourne Shell
for f in ${given-path}*; do
process $f
done
Хорошая идея - использовать как можно больше сценариев оболочки, ограничивая синтаксис оболочки Bourne; это максимизирует портативность. Во многих случаях это также улучшает скорость.
Если вы знаете список возможных расширений, вы можете сделать:
process ${path}{,.Z,.Z,.gz}
Я верю, что Кристиан на правильном пути. Если вы уверены, что, по крайней мере, часть вашего пути, использование встроенной глобализации Bash приведет к любым файлам, соответствующим вашему шаблону.
Например, у меня есть функция в моем.profile, которую я часто использую для отслеживания gzipped и текстовых файлов журнала:
function mscat {
is_gzip="\.gz$"
for file in $@; do
if [[ "$file" =~ $is_gzip ]]; then
zcat $file
else
cat $file
fi
done
}
Который я бы назвал так:
mscat /var/log/ncftpd/sess.2010*
Поскольку глобализация может дать более одного результата, ваша функция "процесс" должна быть способна воздействовать на несколько аргументов. В моем примере вы можете увидеть, как я это делаю, перебирая каждый аргумент в $@.
Когда у вас есть только один файл, вы можете использовать bash globbing process ${path}*