Назад | Перейти на главную страницу

Как разрешить правильный конец пути?

У меня есть переменная оболочки, содержащая этот путь

/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}*