我正在尝试下面的代码。因为我试图检查我在下面提到的目录中获得了两个文件,然后我想完全摆脱 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”语句。
这不是其他,只是其他。