您可以使用命令 seq(带有格式)生成目录名称中的数字...就像这样:
for i in $(seq -f "%03g" 1 5); do
cd output$i
echo -e "sw00092413002xpcw3po_cl.evt
sw00092413002xpcw3po_cl_bary4.evt
sw00092413002sao.fits.gz" | barycorr ra=253.467570 dec=39.760169
cd ..
done
如果要调整各个子目录下数据文件的名称,可以这样写:
for i in $(seq -f "%03g" 1 5); do
cd output$i
f1=$(ls sw*pcw3po_cl.evt 2>/dev/null)
if [ "$f1" == "" ] ; then
echo "no data file in directory output$i"
continue
else
f2=${f1/pcw3po_cl.evt/pcw3po_cl_bary4.evt}
f3=$(ls sw*sao.fits.gz)
echo -e "$f1
$f2
$f3" | barycorr ra=253.467570 dec=39.760169
fi
cd ..
done
脚本分解:
命令:
seq -f "%03g" 1 5
生成序列:
001
002
003
004
005
这意味着循环:
for i in $(seq -f "%03g" 1 5); do
将循环5次,变量i依次取值001、002、003、004、005
在每个循环中,我们运行一些命令。 (我们来分析当i包含001时的第一个循环):
循环的第一行:
cd output$i
相当于output001(所以我们进入目录output001)。
循环的最后一行:
cd ..
在目录树中上升一级(即返回到您在脚本开始时所在的目录)。
执行以下命令:ls sw*pcw3po_cl.evt在目录output001中,并将结果放入变量f1:
f1=$(ls sw*pcw3po_cl.evt)
以下命令采用变量 f1,将字符串 pcw3po_cl.evt 替换为 pcw3po_cl_bary4.evt 并将结果放入变量 f2 中:
f2=${f1/pcw3po_cl.evt/pcw3po_cl_bary4.evt}
执行以下命令:ls sw*sao.fits.gz在目录output001中,并将结果放入变量f3:
f3=$(ls sw*sao.fits.gz)
以下命令:
echo -e "$f1 $f2 $f3" | barycorr ra=253.467570 dec=39.760169
打印出 3 个变量 f1 f2 和 f3 的值(希望包含名称匹配的目录的文件(依次)swpcw3po_cl.evt、swpcw3po_cl_bary4.evt 和 sw* sao.fits.gz
然后它将这些值“管道”到名为 barycorr 的应用程序中,作为该应用程序的标准输入(因此 barycorr 可以读取这些文件名并可能处理这些文件)。