如何解决path的正确结局?

我有一个shellvariables保存这个path

/usr/share/man/man1/bitmap.1 

有可能是一个名为bitmap.1的文件,但它也可以是bitmap.1.z,bitmap.1.gz,bitmap.1.Z。

现在我想把真正的文件传给一个函数,同时parsing正确的文件,比如

 function process { # do something } path="/usr/share/man/man1/bitmap.1" process ${path}.(z|Z|gz) # here the shell shall resolve the real filename 

有没有办法做到优雅或我必须testing,如果bitmap.1,bitmap.1.z等退出,然后将该文件传递给函数?


忘了提及我只限于Bourne-Shell,所以手头没有Brace Expansion – , – 。

你仍然可以在Bourne Shell中做这件事

 for f in ${given-path}*; do process $f done 

尽可能多地执行shell脚本是限制Bourne shell语法的一个好主意; 最大限度地提高可移植性。 在很多情况下,它也提高了速度。

如果您知道可能的扩展名列表,您可以执行:

 process ${path}{,.Z,.Z,.gz} 

我相信基督徒正走在正确的轨道上。 如果您确定至less有一部分path,则使用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* 

因为globbing可以产生多个结果,所以你的'process'函数应该能够处理多个参数。 在我的例子中,你可以通过迭代$ @中的每个参数来看到我是如何做到这一点的。

当你只有一个文件时,你可以使用bash globbing process ${path}*