ファイル名には次の形式のパターンが含まれており、00035023030
最後の2桁のみからに...30
変更されます。ただし、sayなどの...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つのファイルがすべて存在する場合にのみ成功します。