1

Im using:

/usr/local/bin # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.12.7
PRETTY_NAME="Alpine Linux v3.12"

with /bin/ash shell

I have a script which check a status:

#!/bin/sh


full=$(DOCUMENT_URI=/api/$SERVICE_PREFIX/healthz SCRIPT_FILENAME=/app/src/index.php REQUEST_METHOD=GET cgi-fcgi -bind -connect /run/php-fpm/php.sock)

before=${full%$'\r\n\r\n'*}
after=${full#*$'\r\n\r\n'}
stat=$(echo $before | sed 's/.*Status: //' | cut -d " " -f 1)
sub="Status:"


echo "head is: $before"
echo "tail is: $after"
echo "message is: $full"
echo "status is: $stat"
echo "substring is: $sub"
echo "message is: ${sub} ${stat}"



if [[ "$before" == *"$sub"* ]] && [[ "$stat" != "200"]]; then
  exit 1
fi


if [ "$after" != "OK" ]; then
  exit 1
fi

exit

When I execute the script I get response which is correct but if statement doesn't work:

/usr/local/bin # ./liveness_probe1.sh
head is: Status: 300 Multiple Choices
X-Powered-By: PHP/7.4.16
Content-type: text/html; charset=UTF-8
tail is: OK
message is: Status: 300 Multiple Choices
X-Powered-By: PHP/7.4.16
Content-type: text/html; charset=UTF-8

OK
status is: 300
substring is: Status:
message is: Status: 300
/usr/local/bin # echo $?
0

and when I execute just a command I get different response:

/usr/local/bin # DOCUMENT_URI=/api/$SERVICE_PREFIX/healthz SCRIPT_FILENAME=/app/src/index.php REQUEST_METHOD=GET cgi-fcgi -bind -connect /run/php-fpm/php.so
ck
Status: 300 Multiple Choices
X-Powered-By: PHP/7.4.16
Content-type: text/html; charset=UTF-8

OK

Is there any error in this script?

Allan Wind
  • 23,068
  • 5
  • 28
  • 38
a11eksandar
  • 145
  • 2
  • 10

1 Answers1

1

The condition is a syntax error due to the missing white space before the last ]]:

if [[ "$before" == *"$sub"* ]] && [[ "$stat" != "200" ]]; then
  exit 1
fi

Use #!/bin/bash if you require bash features (in this case [[). It's kinda silly you do stat=$(echo $before | sed 's/.*Status: //' | cut -d " " -f 1) opposed to echo "$before" | cut -d'' -f2 or wrap it in a function and use built-ins:

status_code() {
   local v=${1#* }
   echo ${v%% *}
}

status_code "Status: 300 Multiple Choices"

which would return 300. I would probably not bother testing against "Status:" prefix, if it's wrong, then the 2nd string will almost certainly be as well:

if [ "$(status_code "$before")" != "200" ] || [ "$after" != "OK" ]
then
   exit 1
fi
Allan Wind
  • 23,068
  • 5
  • 28
  • 38
  • Im using: /usr/local/bin # cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.12.7 PRETTY_NAME="Alpine Linux v3.12" /usr/local/bin # echo $0 /bin/ash Also, original text is without "Status:200". So if "Status:" is shown that means that is diferent from 200 – a11eksandar Dec 29 '21 at 09:58
  • I replaced the incorrect bash tag with ash (which I have never used). Not sure what you are trying to tell me otherwise. – Allan Wind Dec 30 '21 at 04:25