无法使 Jenkins 中的 AWS CLI 命令中的 IF 条件正常工作
Unable to get the IF condition in AWS CLI commands in Jenkins to work
我正在尝试 运行 通过 Jenkins 作业为 aws 执行一系列命令,但每当涉及到 if 条件时,它都会抛出错误
这是命令列表
echo '****** Updating ASG ********'
aws autoscaling update-auto-scaling-group --auto-scaling-group-name test-asg --desired-capacity 2 --min-size 2 --max-size 6
sleep 200
echo '****** Initiating Instance Refresh ********'
aws autoscaling start-instance-refresh --auto-scaling-group-name test-asg --preferences '{"InstanceWarmup": 300, "MinHealthyPercentage": 100}'
while true;
do
instance_refresh_status=$(aws autoscaling describe-instance-refreshes --auto-scaling-group-name test-asg --query "InstanceRefreshes[0].Status" --output text --region us-east-1)
if (( "$instance_refresh_status" == "Successful" )); then
break
fi
sleep 10
done
echo '****** Finished Instance Refresh ********'
echo '****** Updating ASG back to normal ********'
aws autoscaling update-auto-scaling-group --auto-scaling-group-name test-asg --desired-capacity 1 --min-size 1
我得到的错误是 Jenkins 输出中的这个
+ instance_refresh_status=InProgress
+ InProgress == Successful
/tmp/jenkins8251579523029552853.sh: 10: /tmp/jenkins8251579523029552853.sh: InProgress: not found
无论我尝试将 if 条件包装在 ()、(())、[]、[[]] 中,我都会得到与上述相同的错误。
你能帮我解决这个问题吗?
使用if [ "$instance_refresh_status" = "Successful" ]; then
(注意单个方括号和单个等号)。
你的版本有两个问题:第一,(( ))
是bash主义,你的脚本不是bash下的运行。在任何符合 POSIX 的 shell 中,( )
在子 shell 中运行其内容(作为正常的 shell 命令)。 bash(和其他一些 shells)以不同的方式对待 (( ))
,但在基本的 POSIX shell 中,如破折号(我怀疑你是 运行 下),它只是在 subshell 的两层中运行它的内容。所以它是双子shell中的运行"InProgress" == "Successful"
,它将InProgress
视为命令,==
和Successful
作为它的参数,并在查找命令时出现“未找到”错误。
如果你想使用 bash 功能(或者不知道哪些功能是 bash 主义,哪些在其他 shell 中有效),你应该启动脚本使用适当的 bash-特定的 shebang 行,如 #!/bin/bash
或 #!/usr/bin/env bash
(并且不要通过 运行 脚本和 sh
命令覆盖它)。
第二个问题是在bash中,(( ))
做整数运算求值。给定 (( "InProgress" == "Successful" ))
,它将尝试将 InProgress
和 Successful
计算为整数。此处的细节并不重要,但本质上它们的计算结果均为 0,因此由于 0 == 0
为真,即使它们是完全不同的字符串,测试结果也会为真。
要进行字符串比较,请使用 [ ]
或 [[ ]]
,并且由于 [[ ]]
是另一种 bashism(它们内部的 ==
也是如此),我建议至少使用 [ = ]
,直到您确定您的脚本 shell 在哪个 shell 下。
我正在尝试 运行 通过 Jenkins 作业为 aws 执行一系列命令,但每当涉及到 if 条件时,它都会抛出错误
这是命令列表
echo '****** Updating ASG ********'
aws autoscaling update-auto-scaling-group --auto-scaling-group-name test-asg --desired-capacity 2 --min-size 2 --max-size 6
sleep 200
echo '****** Initiating Instance Refresh ********'
aws autoscaling start-instance-refresh --auto-scaling-group-name test-asg --preferences '{"InstanceWarmup": 300, "MinHealthyPercentage": 100}'
while true;
do
instance_refresh_status=$(aws autoscaling describe-instance-refreshes --auto-scaling-group-name test-asg --query "InstanceRefreshes[0].Status" --output text --region us-east-1)
if (( "$instance_refresh_status" == "Successful" )); then
break
fi
sleep 10
done
echo '****** Finished Instance Refresh ********'
echo '****** Updating ASG back to normal ********'
aws autoscaling update-auto-scaling-group --auto-scaling-group-name test-asg --desired-capacity 1 --min-size 1
我得到的错误是 Jenkins 输出中的这个
+ instance_refresh_status=InProgress
+ InProgress == Successful
/tmp/jenkins8251579523029552853.sh: 10: /tmp/jenkins8251579523029552853.sh: InProgress: not found
无论我尝试将 if 条件包装在 ()、(())、[]、[[]] 中,我都会得到与上述相同的错误。
你能帮我解决这个问题吗?
使用if [ "$instance_refresh_status" = "Successful" ]; then
(注意单个方括号和单个等号)。
你的版本有两个问题:第一,(( ))
是bash主义,你的脚本不是bash下的运行。在任何符合 POSIX 的 shell 中,( )
在子 shell 中运行其内容(作为正常的 shell 命令)。 bash(和其他一些 shells)以不同的方式对待 (( ))
,但在基本的 POSIX shell 中,如破折号(我怀疑你是 运行 下),它只是在 subshell 的两层中运行它的内容。所以它是双子shell中的运行"InProgress" == "Successful"
,它将InProgress
视为命令,==
和Successful
作为它的参数,并在查找命令时出现“未找到”错误。
如果你想使用 bash 功能(或者不知道哪些功能是 bash 主义,哪些在其他 shell 中有效),你应该启动脚本使用适当的 bash-特定的 shebang 行,如 #!/bin/bash
或 #!/usr/bin/env bash
(并且不要通过 运行 脚本和 sh
命令覆盖它)。
第二个问题是在bash中,(( ))
做整数运算求值。给定 (( "InProgress" == "Successful" ))
,它将尝试将 InProgress
和 Successful
计算为整数。此处的细节并不重要,但本质上它们的计算结果均为 0,因此由于 0 == 0
为真,即使它们是完全不同的字符串,测试结果也会为真。
要进行字符串比较,请使用 [ ]
或 [[ ]]
,并且由于 [[ ]]
是另一种 bashism(它们内部的 ==
也是如此),我建议至少使用 [ = ]
,直到您确定您的脚本 shell 在哪个 shell 下。