我有一个保存此路径的 shell 变量
/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 Expansion -,-。
答案1
你仍然可以在 Bourne Shell 中进行通配符
for f in ${given-path}*; do
process $f
done
最好尽可能多地使用 Bourne shell 语法编写 shell 脚本;这样可以最大程度地提高可移植性。在许多情况下,它还可以提高速度。
答案2
如果您知道可能的扩展列表,您可以执行以下操作:
process ${path}{,.Z,.Z,.gz}
答案3
我相信 Christian 走的是正确的路。如果您至少确定了路径的一部分,那么使用 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*
由于通配符可以产生多个结果,因此您的“处理”函数应该能够对多个参数进行操作。在我的示例中,您可以看到我如何通过迭代 $@ 中的每个参数来执行此操作。
答案4
当你只有一个文件时,你可以使用 bash globbingprocess ${path}*