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