循环的 Bash 脚本跳过迭代关联数组的第一个元素

问题描述 投票:0回答:0

内容

我正在开发一个bash脚本

upload backups on Google Drive
。我使用来自 prasmussen github repo 的 gdrive,我目前正在开发一个 python 脚本以使用服务帐户上传到 Google Workspace

逻辑

脚本获取 zip 文件(sql 和图像)并根据类型将它们分配给具有名为 /_backup/mysql//_backup/images/.

键的关联数组

然后是嵌套循环:

the outer loop
遍历两个keys
the inner loop
遍历files.

  for FOLDER_PATH in "${!ASS_ARR_FOLDERS_FILES[@]}"; do
    echo "FOLDER PATH: $FOLDER_PATH"
    for FILE_TO_UPLOAD in ${ASS_ARR_FOLDERS_FILES[$FOLDER_PATH]}; do

代码

这是代码(我只包含了两个 bash 函数):

...
## GLOBALS
SQL_SUBSTRING="sql"
IMG_SUBSTRING="images"
declare -a MOST_RECENT_FILES
declare -A ASS_ARR_FOLDERS_FILES # you must declare it if you want use an associative array
declare -a SQL_FILES
declare -a IMG_FILES
declare -A SPLITTED_FILES # you must declare it if you want use an associative array
TODAY_DATE=$(date +"%Y%m%d")

# The function to upload a file to google drive into a folder already created
function the_uploader_to_parent(){
  echo -e "<p> I AM THE UPLOADER. GET READY TO UPLOAD AND SUFFER </p>"

  # Create a folder with the name of today date
  create_today_folder
  python3.7 /_script/py-uploader/main.py -n "$COMPANY" -c "$TODAY_DATE"

  for RECENT_FILE in "${MOST_RECENT_FILES[@]}"; do
    echo $RECENT_FILE
    SPLITTED_RECENT_FILE=($( echo $RECENT_FILE | tr "." "</p>"))
    if [[ "${SPLITTED_RECENT_FILE[1]}" == "sql" ]]; then
      SQL_FILES+=("$RECENT_FILE")
    else
      IMG_FILES+=("$RECENT_FILE")
    fi
  done
  ASS_ARR_FOLDERS_FILES["/_backup/mysql/"]="${SQL_FILES[@]}"
  ASS_ARR_FOLDERS_FILES["/_backup/images/"]="${IMG_FILES[@]}"

  echo "${!ASS_ARR_FOLDERS_FILES[@]}"
  echo "${ASS_ARR_FOLDERS_FILES[@]}"

  for FOLDER_PATH in "${!ASS_ARR_FOLDERS_FILES[@]}"; do
    echo "FOLDER PATH: $FOLDER_PATH"
    for FILE_TO_UPLOAD in ${ASS_ARR_FOLDERS_FILES[$FOLDER_PATH]}; do
      GET_FILES=($($GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION list --no-header --name-width 0 -q "name contains '$FILE_TO_UPLOAD' and trashed=false and mimeType != 'application/vnd.google-apps.folder'"))
      if [[ "$FILE_TO_UPLOAD" != "${GET_FILES[1]}" ]]; then
        if [[ "$FOLDER_PATH" == "/_backup/mysql/" ]] && [[ "$FILE_TO_UPLOAD" == *"$SUBSTRING_FILE"* ]]; then
          if [ ${FOLDER_PATH:0-1} == "/" ]; then
            echo -e "\n FROM upload_in_drive $FILE_TO_UPLOAD for the COMPANY $COMPANY \n"
            UPLOAD_OUTPUT=`$GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION upload --no-progress -p $TODAY_FOLDER_ID ${FOLDER_PATH}$FILE_TO_UPLOAD`
            echo $UPLOAD_OUTPUT
            /usr/bin/python3.7 /_script/py-uploader/main.py -p "$FOLDER_PATH$FILE_TO_UPLOAD" -n "$COMPANY"
          else
            echo -e "\n FROM upload_in_drive $FILE_TO_UPLOAD for the COMPANY $COMPANY \n"
            UPLOAD_OUTPUT=`$GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION upload --no-progress -p $TODAY_FOLDER_ID ${FOLDER_PATH}/$FILE_TO_UPLOAD`
            echo $UPLOAD_OUTPUT
            /usr/bin/python3.7 /_script/py-uploader/main.py -p "$FOLDER_PATH/$FILE_TO_UPLOAD" -n "$COMPANY"
          fi
        elif [[ "$FOLDER_PATH" == "/_backup/images/" ]] && [[ "$FILE_TO_UPLOAD" == *"$SUBSTRING_FILE"* ]]; then
          if [ ${FOLDER_PATH:0-1} == "/" ]; then
            echo -e "\n FROM upload_in_drive $FILE_TO_UPLOAD for the COMPANY $COMPANY \n"
            UPLOAD_OUTPUT=`$GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION upload --no-progress -p $TODAY_FOLDER_ID ${FOLDER_PATH}$FILE_TO_UPLOAD`
            echo $UPLOAD_OUTPUT
            /usr/bin/python3.7 /_script/py-uploader/main.py -p "$FOLDER_PATH$FILE_TO_UPLOAD" -n "$COMPANY"
          else
            echo -e "\n FROM upload_in_drive $FILE_TO_UPLOAD for the COMPANY $COMPANY \n"
            UPLOAD_OUTPUT=`$GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION upload --no-progress -p $TODAY_FOLDER_ID ${FOLDER_PATH}/$FILE_TO_UPLOAD`
            echo $UPLOAD_OUTPUT
            /usr/bin/python3.7 /_script/py-uploader/main.py -p "$FOLDER_PATH/$FILE_TO_UPLOAD" -n "$COMPANY"
          fi
        fi
      else
        echo -e "\n File already uploaded \n"
      fi
    done
  done
  DISK_USAGE=`df -h --total | grep ^total`
  DRIVE_USAGE_TOTAL=`$GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION about | grep ^Total`
  DRIVE_USAGE_USED=`$GDRIVE_LOCATION --config $GDRIVE_CONFIG_LOCATION about | grep ^Used`
  echo ""
  echo ""
  echo -e "\n File caricati con successo nella cartella $TODAY_DATE in $GDRIVE_FOLDER \n"
  echo -e "\n Disk Usage: $DISK_USAGE \n"
  echo -e "\n Drive Usage: $DRIVE_USAGE_USED on $DRIVE_USAGE_TOTAL \n"
  echo -e "\n File caricati con successo nella cartella $TODAY_DATE in $GDRIVE_FOLDER. Disk Usage: $DISK_USAGE Drive Usage: $DRIVE_USAGE_USED on $DRIVE_USAGE_TOTAL \n" > $PATH_INFO_DRIVE

}


function get_recent_files_from_folder(){
  # $1 = the folder from which get the files
  FOLDERS=($@) # $@ means get all passed parameters
 
  echo -e "\n Start getting files... \n"
  RANDOM=$$
  for FOLDER in "${FOLDERS[@]}"; do
    for FILE in `ls $FOLDER`; do
      # To have unique values I have to include time
      SPLITTED_FILE_DATETIME=($( echo $FILE | tr "_" "\n"))
      SPLITTED_FILES["${SPLITTED_FILE_DATETIME[0]}_$RANDOM"]=$FILE
    done
  done
  echo -e "\n End getting files... \n"

  TODAY_Ymd=$(date +"%Y%m%d")
  for KEY in "${!SPLITTED_FILES[@]}"; do
    SPLITTED_DATE=($( echo $KEY | tr "-" "\n" ))
    if [[ $TODAY_Ymd == "${SPLITTED_DATE[0]}" ]]; then
      MOST_RECENT_FILES+=("${SPLITTED_FILES[$KEY]}")
    fi
  done
  
  echo "${MOST_RECENT_FILES[@]}"

  the_uploader_to_parent
}

// Starting point of the bash script
get_recent_files_from_folder "${SAVED_PATH[@]}"

问题

脚本在 2-3 天前工作正常,但现在的问题是

the outer loop
似乎没有遍历脚本中的第一个键 /_backup/mysql/,下面的路径打印 2 键,但只有 /_backup/images/ 继续逻辑,显然是错误的,因为 /_backup/images/: 中没有 .sql.zip 文件

the outer loop
中的行:
echo "FOLDER PATH: $FOLDER_PATH"

输出
FOLDER PATH: /_backup/mysql/
脚本似乎跳到了2键
FOLDER PATH: /_backup/images/
剧本继续

ls -l /_script/uploader/upload_in_drive 输出

-rwxr-xr-x. 1 root root 16587 15 mar 09.16 /_script/uploader/upload_in_drive

我不知道为什么直到 2-3 天前它工作正常,现在不再工作了。

linux bash shell centos7
© www.soinside.com 2019 - 2024. All rights reserved.