如何使用 while 循环在 Unix 外壳脚本中迭代值



>我有一个名为"qe/performance"的路径位置,想要将"jmx"文件复制到 AWS 中的 S3 存储桶。复制文件后,我想使用 while 循环将结果文件夹中转换后的文件 (.jtl( 列出到 s3 存储桶中。如果文件存在(成功(,它将更新 ECS 集群并删除 ec2 实例以减少负载并将消息发送到该文件已上传的组。

另一方面,如果转换后的文件未呈现到 S3 存储桶中的结果文件夹,我想将"超时阈值"设置为 10 分钟,并使用迭代和睡眠 60 秒等待文件上传到 S3 存储桶。如果迭代周期超过超时阈值,它将发送电子邮件通知文件尚未上传。

#/bin/bash
TimeoutThreshold=10
holder="qe/performance/"
echo $holder
for files in $holder; do
aws s3 cp $files s3://$JMeterFilesBucket/scripts/ --recursive
i=0
while [ true ]; do
aws s3 ls s3://$JMeterFilesBucket/results/ --recursive |grep .jtl
if [ "$?" -ne "0" ]; then 
sleep 60
iterator=$i + 1
if [ iterator -eq "$TimeoutThreshold" ]; then
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) failed to load to the s3 bucket: s3://$JMeterFilesBucket/results/";
else
sleep 60
fi
exit 0
else [ "$?" -eq "0" ]; then 
aws ecs update-service --cluster $Cluster --service $Service --desired-count $CURRENT_DESIRED_COUNT --region ${AWS::Region}
echo "publishing SNS Notification for the files that have been uploaded successfully"
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) have successfully loaded to the s3 bucket: s3://$JMeterFilesBucket/results/";
break
fi
done
done

这是运行此命令后的结果,它仍然继续显示这样的文件列表并中断

在这两种情况下都没有电子邮件通知通过


qe/performance/

21:49:50
Completed 14.7 KiB/14.7 KiB (86.3 KiB/s) with 1 file(s) remaining upload: qe/performance/ContribAccl_Dev.jmx to s3://retqa-jmeterfiles/scripts/ContribAccl_Dev.jmx

21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl

21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl

21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl

21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl

21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl

21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl

21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl

21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl

21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl

21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl

21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl

21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl

21:49:54
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl

21:49:54
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl

21:49:54
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl

21:49:54
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl

21:49:54
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl

21:49:54
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl

你这里有一个错字:

#/bin/bash

这应该从#!开始,而不仅仅是#

这是错误的:

else [ "$?" -eq "0" ]; 

你不要在else之后提出条件。如果要进行其他测试,则必须使用elif

但是不需要其他条件。此条件与第一个条件正好相反,因此只需编写else,它就会执行代码。

if [ "$?" -ne "0" ]; then
sleep 60
iterator=$i + 1
if [ iterator -eq "$TimeoutThreshold" ]; then
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) failed to load to the s3 bucket: s3://$JMeterFilesBucket/results/";
else
sleep 60
fi
exit 0
else
aws ecs update-service --cluster $Cluster --service $Service --desired-count $CURRENT_DESIRED_COUNT --region ${AWS::Region}
echo "publishing SNS Notification for the files that have been uploaded successfully"
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) have successfully loaded to the s3 bucket: s3://$JMeterFilesBucket/results/";
break
fi

then后也无需转义换行符。

while循环似乎也没有任何意义。如果条件为 true,它将使用exit终止脚本,但如果条件为 false,它将使用break停止循环。无论哪种方式,都只运行循环的第一次迭代。

这不是递增变量的正确方法:

iterator=$i + 1

这将尝试在环境变量iterator设置为$i的情况下执行语句+ 1。但+ 1不是有效的命令。你应该写:

((iterator = $i + 1))

双括号使其成为算术表达式,而不是普通命令。

然后,您需要在测试iterator变量时将其放在$之前:

if [ "$iterator" -eq "$TimeoutThreshold" ]; then

但是,$i总是0,因为您永远不会增加它。如果循环没有立即结束,您可以使用

((i++))

在循环的末尾。

我只想解决你的 if/else 语句的一般结构。 如果你的语法正确,你会写:

if [ "$?" -ne "0" ]; then 
command_1
elif [ "$?" -eq "0" ]; then
command_2   # This can never happen
else
command_3
fi

但这是错误的。 第二个命令列表(elif的部分(永远不会发生。 原因是,如果前面的命令失败,则将执行command_1,并且不会执行command_2或command_3。 但是,如果前面的命令没有失败,则[ "$?" -ne "0" ]将失败,将$?设置为非零值。 然后[ "$?" -eq "0" ]将失败,因为if部分执行的命令更改了$?的值。 不要这样写。

最新更新