Bash - for...doループで生成された最後のファイルを計算できません。

Bash - for...doループで生成された最後のファイルを計算できません。

bashスクリプト(重要な場合はUbuntu 22)には、for ... doループで実行され、いくつかのSQLplus <query_name> .sqlを実行し、結果を<query_name>に保存するファイル名を持つ関数があります。 CSV

成功したかどうかを確認し、作成したCSVファイルのサイズを印刷する機能をいくつか追加しました。

しかし... 3つのクエリを実行し、成功メッセージにファイルサイズを報告します。問題ありません。ただし、4番目と最後のエントリでは、「Statxできません:そのファイルまたはディレクトリはありません」というエラーが発生します。すぐそこから見ることができます。あるいは、プロセス全体がディレクトリ内のファイルを一覧表示すると、それが表示されます。

前回と同じように機能しない理由をご覧ください。

以下はrun_query()とSuccess_file()関数のコードです。私が何をしているのかを確認してください。

[スニペットではなくスクリプトファイル全体を表示するように編集しました]

#!/bin/bash

source ~/overnights/scripts/.globals/.filenames
source ~/overnights/scripts/.globals/.creds
source ~/overnights/scripts/.globals/.commands.sh

echo "============================================================================="
echo "=  Starting to fetch Banner data                                            ="
echo "============================================================================="

# cleandrop() called from each sql script execution to finish the whole process if one file fails.
cleandrop () {
  echo "`date`: Problems connecting to or fetching from Oracle. Cleaning up and exiting."
  rm -f ${IN_BANNER}/*
  cd $SCRIPT_DIR
  exit 1
}

# Displays confirmations of which file we have just processed.
success_file () {
    size=$(stat -c%s "$2")
    echo "`date`: SQL script executed successfully for $1"
    echo "`date`: Output file saved to $2 (${size} bytes)."
    echo
}

# Given a query name from the array "queries" performs the query and saves the output.
run_query () {
    SQL="${BANNER_SCRIPTS}/$1.sql"
    CSV="${IN_BANNER}/$1.csv"
    echo "`date`: Beginning ${SQL} processing."
    sqlplus64 -S "${OUSER}/${OPASS}@//${OHOST}:${OPORT}/${OSID}" @${SQL}

# Check the exit status of sqlplus to see if the SQL script ran successfully
    if [[ $? -eq 0 ]]
    then
      success_file ${SQL} ${CSV}
    else
      cleandrop
    fi
}

# Try a connection just to make sure it works first otherwise exit
echo "exit" | sqlplus64 -L "${OUSER}/${OPASS}@//${OHOST}:${OPORT}/${OSID}" | grep Connected > /dev/null

if [[ $? -ne 0 ]]
then
   cleandrop
else
  echo "`date`: Connection checked okay, proceeding to fetch Banner data."
fi

# Remove files from previous runs if they exist.
cd $IN_BANNER

signal="${IN_BANNER}/DONE.txt"

if [[ -f "$signal" ]]
then
    echo "`date`: Removing signal file ${signal}"
    rm -f $signal
    echo "`date`: Removing any previous data files in ${IN_BANNER}"
    echo
    rm -f ${IN_BANNER}/*.csv
fi
rm -f *

# Set up the array of query names to execute with run_query()
queries=( ora_SRS_PEOPLE
          ora_SRS_COURSES
          ora_SRS_ENROLS
          ora_SRS_STAFF
          )

for query in "${queries[@]}"
do
    run_query ${query}
done

# drop in a signal file so other processes can tell if the downloads have completed.
echo "`date`: Creating completion signal file ${signal}"
touch ${signal}
echo
echo  "`date`: Listing of data files collected in ${IN_BANNER}"
ls -lh ${IN_BANNER}

cd ${SCRIPT_DIR}
echo
echo "`date`: overnights_oracle.sh completed"
exit 0

...私が見た結果は次のとおりです。

=============================================================================
=  Starting to fetch Banner data                                            =
=============================================================================
Sat Oct  7 15:55:53 BST 2023: Connection checked okay, proceeding to fetch Banner data.
Sat Oct  7 15:55:53 BST 2023: Removing signal file /home/p0071665/overnights/data/downloads/banner/DONE.txt
Sat Oct  7 15:55:53 BST 2023: Removing any previous data files in /home/p0071665/overnights/data/downloads/banner

Sat Oct  7 15:55:53 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_PEOPLE.sql processing.
Sat Oct  7 15:57:54 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_PEOPLE.sql
Sat Oct  7 15:57:54 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_PEOPLE.csv (10776253 bytes).

Sat Oct  7 15:57:54 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_COURSES.sql processing.
Sat Oct  7 15:58:04 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_COURSES.sql
Sat Oct  7 15:58:04 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_COURSES.csv (3992287 bytes).

Sat Oct  7 15:58:04 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_ENROLS.sql processing.
Sat Oct  7 16:01:07 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_ENROLS.sql
Sat Oct  7 16:01:07 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_ENROLS.csv (26717546 bytes).

Sat Oct  7 16:01:07 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_STAFF.sql processing.
Sat Oct  7 16:01:11 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_STAFF.sql
Sat Oct  7 16:01:11 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_STAFF.csv ( bytes).

Sat Oct  7 16:01:11 BST 2023: Creating completion signal file /home/p0071665/overnights/data/downloads/banner/DONE.txt

Sat Oct  7 16:01:11 BST 2023: Listing of data files collected in /home/p0071665/overnights/data/downloads/banner
total 41M
-rw-r--r-- 1 p0071665 p0071665    0 Oct  7 16:01 DONE.txt
-rw-r--r-- 1 p0071665 p0071665 3.9M Oct  7 15:58 ora_SRS_COURSES.csv
-rw-r--r-- 1 p0071665 p0071665  26M Oct  7 16:01 ora_SRS_ENROLS.csv
-rw-r--r-- 1 p0071665 p0071665  11M Oct  7 15:57 ora_SRS_PEOPLE.csv
-rw-r--r-- 1 p0071665 p0071665 1.2M Oct  7 16:01 ora_SRS_STAFF_ENROLS.csv

実行時にコンソールに表示される内容は次のとおりです。

stat: cannot statx '/home/p0071665/overnights/data/downloads/banner/ora_SRS_STAFF.csv': No such file or directory

しかし、私はそのファイルがそこにあることを知っています。移動してコピーでき、ls -alなどにリストされます。

statがファイルを見つける前にファイルを「閉じる」ために何かをすべきかどうか疑問に思いましたが、統計を実行する前にファイルに「touch」および「remove」信号を追加しましたが、何の効果もありませんでした。完全に重要ではありませんが、実行中のクエリ配列の1つの要素でのみ機能しない理由は疑問に思います。

乾杯、ジョーク

答え1

コードにタイプミスがあるようです。いいえora_SRS_STAFF.csv、したがってエラーメッセージは正しいです。

-rw-r--r-- 1 p0071665 p0071665    0 Oct  7 16:01 DONE.txt
-rw-r--r-- 1 p0071665 p0071665 3.9M Oct  7 15:58 ora_SRS_COURSES.csv
-rw-r--r-- 1 p0071665 p0071665  26M Oct  7 16:01 ora_SRS_ENROLS.csv
-rw-r--r-- 1 p0071665 p0071665  11M Oct  7 15:57 ora_SRS_PEOPLE.csv
-rw-r--r-- 1 p0071665 p0071665 1.2M Oct  7 16:01 ora_SRS_STAFF_ENROLS.csv

関連情報