'Bash IF condition with multiple conditions not giving proper result
Trying to fetch the status of the URL for sonarqube quality gate and check if the status is "OK" the condition should pass or if the status is "ERROR" then it should fail.
quality_gatesstatus=$(curl -u $SONAR_TOKEN:https://$SONAR_SERVER/api/qualitygates/project_status?projectKey=$SONAR_PROJECT_KEY\&pullRequest=$SONAR_PR_KEY | grep -Po '"status": *\K"[^"]*"')
echo $SONAR_PR_KEY
echo "Checking the Sonar Quality gate status"
if ("$quality_gatesstatus" != "OK") && ("$quality_gatesstatus" != "NONE")
then
echo "check sonar server and fix the issues: $quality_gatesstatus"
exit 1
else
echo "Quality gate succeeded"
fi
But its not working as per the IF statement, its going always to the else condition
Solution 1:[1]
The line:
if ("$quality_gatesstatus" != "OK") && ("$quality_gatesstatus" != "NONE")
is evaluated as follows (not precisely, this is a heuristic):
- the variable
$quality_gatestatus
is expanded to some string, sayS
S
is executed as a command, with the arguments!=
andOK
- If that command succeeds, then it is executed again with the arguments
!=
andNONE
. If that command succeeds then the first block of commands is executed. Otherwise, the commands in theelse
block are executed.
The error you are seeing is because the string S
is not an executable command. Almost certainly what you actually want is:
if [ "$quality_gatesstatus" != OK ] && [ "$quality_gatesstatus" != NONE ]; then ...
but more likely you want a case
statement:
case "$quality_gatesstatus" in
OK) ... ;;
NONE) ... ;;
*) ... ;;
esac
The syntax of the shell is a bit counter-intuitive. It is not if condition; then commands; fi
. It is if commands; then commands; fi
. In other words, when you write if [ 5 = 5 ]
, the [
and ]
are not part of the shell syntax. Instead, the command [
is executed with arguments 5
, =
, and ]
. Although [
is probably the most common command executed in an if
block, it can be any set of commands, and it is common to see constructs like if grep ...
or if shh ...
or if curl ...
. It is slightly less common to see if cmd1; cmd2; cmd3; then ...
, but you will see it now and again.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |