У меня есть переменная оболочки, содержащая этот путь
/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 под рукой нет -,-.
решение1
Вы все еще можете использовать подстановку в Bourne Shell
for f in ${given-path}*; do
process $f
done
Хорошей идеей будет ограничить как можно большую часть скриптов оболочки синтаксисом оболочки Bourne; это максимизирует переносимость. Во многих случаях это также повышает скорость.
решение2
Если вы знаете список возможных расширений, вы можете сделать:
process ${path}{,.Z,.Z,.gz}
решение3
Я считаю, что Кристиан на правильном пути. Если вы уверены хотя бы в части своего пути, использование встроенного подстановочного кода Bash даст вам все файлы, соответствующие вашему шаблону.
Например, в моем .profile есть функция, которую я часто использую для копирования сжатых gzip и текстовых файлов журналов:
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*
Поскольку подстановка может дать более одного результата, ваша функция 'process' должна быть способна действовать на основе нескольких аргументов. В моем примере вы можете увидеть, как я это делаю, перебирая каждый аргумент в $@.
решение4
если у вас есть только один файл, вы можете использовать подстановку bashprocess ${path}*