配列に値を追加し、その値に基づいて繰り返します。

配列に値を追加し、その値に基づいて繰り返します。

以下のように3つのファイルがあります。

CV_REF_DATA_09012021.txt
DB_ONLINE_CL_09012021.txt
DFR_CL_INS_09012021.txt

/NAS/CFG/にファイルがあることを確認し、それを配列に追加したいと思います。常に3つのファイルがすべて存在する必要はありません。したがって、1つ、2つ、または3つのファイルのいずれかにすることができます。ファイルが存在しない場合、スクリプトは終了し、同じ内容を表示する必要があります。次に、配列に基づいて繰り返し、「呼び出し」スクリプトを実行したいと思います。

呼び出しスクリプトもファイルモードを使用してファイル数を確認します。次のコードは呼び出しスクリプトからのものです。

NASFilecnt=`find . -type f -name "${CV_REF_DATA}*.txt" | wc -l`

それでは、上記の内容に基づいてループをどのように実行しますか?ご質問がございましたらお知らせください。

ベストアンサー1

あなたがしたいことの説明は、ファイルの存在に応じて少しあいまいです。各ファイル名プレフィックスの名前を個別に収集するのか、それとも一緒に収集するのかは不明です。たとえば、特定の日付を選択し、その日付からファイルセットを見つけることをお勧めします。以下のコードは、プログラミング操作のいくつかのサポートを提供する必要があります。

この答えは、次の私の答えと似ています。前の質問静的文字列セットを繰り返して、これらの文字列を含むファイル名が存在するかどうかをテストします。

ファイル名プレフィックスを繰り返し、各反復ごとに対応するプレフィックス.txt(およびファイル名サフィックス)を持つファイルがあることを確認できます。

for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
        set -- /NAS/CFG/"$prefix"*.txt
        if [ -e "$1" ]; then
                printf 'There exists names matching "%s"*.txt:\n' "$prefix"
                printf '\t%s\n' "$@"
        else
                printf 'No names matches "%s"*.txt\n' "$prefix"
        fi
done

ループはファイル名のプレフィックスを繰り返し、各反復でそのプレフィックスに関心のあるファイルと一致する必要があるパターンを拡張しようとします。このsetコマンドは、一致するファイル名を場所引数リストに保存します("$@";;"$1"はリストの最初の要素です)。

bashシェルでは、上記のコードブロックを次のように書くことができます。

shopt -s nullglob

for prefix in CV_REF_DATA_ DB_ONLINE_CL_ DFR_CL_INS_; do
        names=( /NAS/CFG/"$prefix"*.txt )
        if [ "${#names[@]}" -gt 0 ]; then
                printf 'There exists names matching "%s"*.txt:\n' "$prefix"
                printf '\t%s\n' "${names[@]}"
        else
                printf 'No names matches "%s"*.txt\n' "$prefix"
        fi
done

シェルnullglobオプションを使用すると、一致しないワイルドカードパターンが拡張されずに残るのではなく消えます。names各反復で一致するファイル名を保持するために名前付き配列を使用します。


質問の文字通りの説明:ディレクトリに1つ以上のツリーファイル名がある場合は、別のスクリプトが呼び出されますCV_REF_DATA_09012021.txtDB_ONLINE_CL_09012021.txt配列に既存の名前を追加します。DFR_CL_INS_09012021.txt/NAS/CFG

shopt -s nullglob
unset -v names

for name in CV_REF_DATA_09012021.txt DB_ONLINE_CL_09012021.txt DFR_CL_INS_09012021.txt
do
        [ -e /NAS/CFG/"$name" ] && names+=( "$name" )
done

if [ "${#names[@]}" -eq 0 ]; then
        echo 'no files could be found' >&2
        exit 1
fi

# At least one name is in the "names" array.
# Call your other script below here.

おすすめ記事