![迭代名稱中數字範圍遞增但不連續的文件](https://rvso.com/image/192250/%E8%BF%AD%E4%BB%A3%E5%90%8D%E7%A8%B1%E4%B8%AD%E6%95%B8%E5%AD%97%E7%AF%84%E5%9C%8D%E9%81%9E%E5%A2%9E%E4%BD%86%E4%B8%8D%E9%80%A3%E7%BA%8C%E7%9A%84%E6%96%87%E4%BB%B6.png)
檔案名稱包含以下形式的模式00035023030
,僅在最後兩位數字中從...30
到發生變化。但如果like say中...35
漏掉了一個數字,就會拋出錯誤。如何繞過此錯誤並循環運行以下命令列表?30
35
31
這barycorr
是詢問我三個輸入的程式:
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz
我為每個運行創建的腳本文件:
echo -e "/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
/home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023030/auxil/sw00035023030sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log
echo -e "/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl.evt
/home/dinesh/Test/output00035023031/sw00035023031xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023031/auxil/sw00035023031sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log
echo -e "/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023032xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log
echo -e "/home/dinesh/Test/output00035023033/sw00035023033xwtw2po_cl.evt
/home/dinesh/Test/output00035023032/sw00035023033xwtw2po_cl_bary.evt
/home/dinesh/Test/00035023032/auxil/sw00035023032sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 &>log
答案1
您的腳本不會停止並將運行所有命令。您所需要做的就是忽略該錯誤。但是,您確實可以使其跳過丟失的檔案。例如,您可以像這樣重寫腳本(假設 bash 版本 4 或更高版本,用於大括號擴充中的零填充):
#!/bin/bash
for num in {00035023030..00035023033}; do
dir=/home/dinesh/Test/output"${num}"
file1="$dir/sw${num}xwtw2po_cl.evt"
file2="$dir/sw${num}xwtw2po_cl_bary.evt"
file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"
if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
printf '%s %s %s' "$file1" "$file2" "$file3" |
barycorr ra=253.467570 dec=39.760169 &>>log
else
echo "Some files missing for $num" >> log
fi
done
解釋
for num in {00035023030..00035023033}; do
:此{start..end}
表示法稱為“大括號擴展”,並將擴展為從start
到 的所有數字end
:$ echo {00035023030..00035023033} 00035023030 00035023031 00035023032 00035023033
這for variable in something
是一個 for 循環,它將變數的值($num
在本例中為 )設為每個「東西」。這意味著該循環將迭代從 00035023030 到 0035023033 的數字。
在循環內部,我們只需設定一些變量,以避免需要編寫很長的名稱並保持一切乾淨。所以我們有:
dir=/home/dinesh/Test/output"${num}" file1="$dir/sw${num}xwtw2po_cl.evt" file2="$dir/sw${num}xwtw2po_cl_bary.evt" file3="/home/dinesh/Test/$num/auxil/sw${num}sao.fits.gz"
${num}
需要這樣 shell 才能理解類似的事情,sw${num}xwtw2po_cl_bary.evt
因為sw$numxwtw2po_cl_bary.evt
shell 無法知道變數的名稱是$num
或不是$numxwtw2po_cl_bary.evt
。if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
:這if
只是檢查所有三個文件是否存在。正在-e
檢查文件是否存在。因此,if
只有當所有三個文件都存在時才會成功。