名前に数値の範囲が増えますが、連続していないファイルを繰り返します。

名前に数値の範囲が増えますが、連続していないファイルを繰り返します。

ファイル名には次の形式のパターンが含まれており、00035023030最後の2桁のみからに...30変更されます。ただし、sayなどの...35数字が欠落しているとエラーが発生します。このエラーを回避し、次のコマンドのリストをループで実行するにはどうすればよいですか?303531

以下は、barycorr3つの入力を要求するプログラムです。

  1. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl.evt
  2. /home/dinesh/Test/output00035023030/sw00035023030xwtw2po_cl_bary.evt
  3. /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 somethingforループです。$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" ]]; thenif3つのファイルがすべて存在することを確認してください。ファイルが存在することを確認しています-e。したがって、if3つのファイルがすべて存在する場合にのみ成功します。

関連情報