我有一個 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,所以手邊沒有支撐延伸 -,-。
答案1
您仍然可以在 Bourne Shell 中進行通配操作
for f in ${given-path}*; do
process $f
done
最好將盡可能多的 shell 腳本限制為 Bourne shell 語法;最大限度地提高了便攜性。在許多情況下,它還可以提高速度。
答案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*
由於通配符可以產生多個結果,因此您的“處理”函數應該能夠對多個參數進行操作。在我的範例中,您可以透過迭代 $@ 中的每個參數來了解我是如何做到這一點的。
答案4
當你只有一個檔案時,你可以使用 bash globbingprocess ${path}*