shell 脚本中 else 附近的语法错误

shell 脚本中 else 附近的语法错误

我正在尝试下面的代码。因为我试图检查我在下面提到的目录中获得了两个文件,然后我想完全摆脱 while 循环!但如果我还没有收到文件,那么它应该继续迭代并等待。但是通过使用下面的代码,我在其他部分遇到错误。错误是:

syntax error near unexpected token else

我应该做什么来修复它?另一个问题是如何在 Visual Studio Code 中格式化我的 shell 脚本,我在 VSC 中没有找到它的任何扩展名。

day_of_month=1
export filesdir=/dir1/dir2/dir3
local count=0
numFilesReceived=0
while true; do
        files=$(find $filesdir -name '*.txt.gz' -type f -mmin -1)
        if [ "$day_of_month" == "1" ]; then
            if [ -f "$files" ]; then
                count=$((count + 1))
                break
                if [ "$numFilesReceived" == "$count" ]; then
                    echo "All $count data received!"
                    break 3
                fi
            fi
            else
                echo "No data received yet!" 
            fi
            fi
             else
            rm $files
        fi
       done

答案1

您收到错误是因为 if/else 不平衡。 sh 脚本中 if/else 的语法为:

if condition 
then
    do something
else
    do something else
fi

每个都if需要用一个 来关闭fi。接下来,您将所有文件存储在单个字符串变量中:

files=$(find $filesdir -name '*.txt.gz' -type f -mmin -1)

这意味着如果您的find命令返回如下内容:

$ find . -name '*.txt.gz' -type f
./file2.txt.gz
./file1.txt.gz

那么你的变量的内容将是:

$ files=$(find . -name '*.txt.gz' -type f)
$ echo "$files"
./file2.txt.gz
./file1.txt.gz

但随后您检查是否存在具有该名称的文件:

if [ -f "$files" ]; then

这永远不会是真的,因为你没有一个名字是字面意思的文件./file2.txt.gz\n./file1.txt.gz,即使你有,它也会包含在结果中。无论如何,您已经知道它们是文件并且它们存在,因为这就是命令find正在执行的操作,使得此测试更加不必要。

你还有很多不必要的变量,你设置day_of_month=1然后使用if [ "$day_of_month" == "1" ]它是没有意义的,因为这永远是正确的。对于numFilesReceived和 也是如此count。我不明白你想用这两个做什么,所以我猜你想设置count为非 0 值,然后在文件数量与该值匹配时退出。我也不明白这有什么意义day_of_month,我猜如果这是本月的第一天,您想删除这些文件。如果是这样,您还需要检查当前日期。

这是我对您想要的内容的最佳猜测的工作版本:

#!/bin/bash

filesdir=/dir1/dir2/dir3
expectedFiles=2
dayToDelete=1

## Get the current day of the month
day_of_month=$(date '+%d')

while true; do
  ## If this is not the 1st day of the month, just delete the files
  ## and exit
  if [ "$day_of_month" != "1" ]; then
    find "$filesdir" -name '*.txt.gz' -type f -mmin -1 -delete
    exit
  ## If this is the first day of the month
  else
    ## You don't need the file names, only their number,
    ## so just print a dot so you don't need to worry about
    ## whitespace in the names
    fileCount=$(find "$filesdir" -name '*.txt.gz' -type f -mmin -1 -printf '.\n' | wc -l)
    if [[ "$fileCount" == "$expectedFiles" ]]; then
      echo "All $expectedFiles files received!"
      exit 
    else
      echo "No data received yet!"
      ## Wait for 5 seconds. No point in spamming, in fact you
      ## probably want to sleep for longer.
      sleep 5
    fi
  fi
done

我怀疑这并不是您真正需要的,但我希望它可以作为一个起点。如果您需要更多帮助,请提出一个新问题,但请向我们提供脚本应执行的操作的详细信息,以便我们可以更好地为您提供帮助。

答案2

您有 3 个“if”语句和 5 个“fi”语句。

这不是其他,只是其他。

相关内容