![名前に連続していないが増加する数値範囲を持つファイルを反復処理します。](https://rvso.com/image/192250/%E5%90%8D%E5%89%8D%E3%81%AB%E9%80%A3%E7%B6%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%8C%E5%A2%97%E5%8A%A0%E3%81%99%E3%82%8B%E6%95%B0%E5%80%A4%E7%AF%84%E5%9B%B2%E3%82%92%E6%8C%81%E3%81%A4%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%8D%E5%BE%A9%E5%87%A6%E7%90%86%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
ファイル名には、最後の 2 桁が から にのみ変更される形式のパターンが含まれています。ただし、 のように 1 つの数字が から に省略されると、00035023030
エラーがスローされます。このエラーを回避して、以下のコマンド リストをループで実行するにはどうすればよいでしょうか。...30
...35
30
35
31
以下はbarycorr
3 つの入力を求めるプログラムです。
/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}
は、シェルが のようなことを理解できるようにするために必要です。sw${num}xwtw2po_cl_bary.evt
なぜなら、 では、sw$numxwtw2po_cl_bary.evt
シェルは変数の名前が であり$num
、 ではないことを知ることができないからです$numxwtw2po_cl_bary.evt
。if [[ -e "$file1" && -e "$file2" && -e "$file3" ]]; then
: これはif
単に 3 つのファイルがすべて存在するかどうかを確認します。 は-e
ファイルの存在を確認しています。したがって、 はif
3 つのファイルがすべて存在する場合にのみ成功します。