2016-06-03 2 views
1

Я новичок в сценариях Bash. Я добавил if .. else в сценарий Bash. Мой скрипт предназначен для создания контейнеров Docker, если контейнер не существует, и создания нового контейнера, если он существует. Но сценарий никогда не запускает блок else; он всегда запускает блок if.Bash script if .. else .. не работает

Мой сценарий:

#!/bin/bash 
tomcat=$(ssh [email protected] sudo docker ps -a | grep -w 'my-tomcat') 
echo "$?" 

if [ "$BRANCH" = "tomcat" ] && [ "$?" -eq 0 ]; then 
     ssh [email protected] /bin/sh <<-EOF 
       { cd tomcat/ && sudo docker stop my-tomcat && sudo docker rm my-tomcat; } \ 
       && { sudo docker build -t tomcat .; } \ 
       && { sudo docker run -h tomcat --name my-tomcat -itd -p 2013:8080 tomcat; } \ 
       && { sudo docker start my-tomcat; } 
     EOF 
else 
     ssh [email protected] /bin/sh <<-EOF 
       { cd tomcat/ && sudo docker build -t tomcat .; } \ 
       && { sudo docker run -h tomcat --name my-tomcat -itd -p 2013:8080 tomcat; } \ 
       && { sudo docker start my-tomcat; } 
     EOF 
fi 
+0

Является ли «$ ФИЛИАЛ» равно «» кот все время? – Krishna

+1

Скопируйте свой скрипт в http://www.shellcheck.net/, и он бросил уродливую ошибку 'При использовании << -, вы можете только отступать с вкладками. Исправление этой ошибки может помочь вам решить проблему. – Inian

+0

Является ли« $ ФИЛИАЛ «все время равно« кошка »и в чем причина того, что он принимает переменную кошку? – Krishna

ответ

2

После запуска:

echo "$?" 

if [ "$BRANCH" = "tomcat" ] && [ "$?" -eq 0 ]; then 

В вашем if заявлении "$?" всегда будет 0, потому что она будет представлять собой значение, возвращаемое [ "$BRANCH" = "tomcat" ]. И даже если это не так, это будет представлять собой возвращаемое значение echo.

ли это вместо того, чтобы сохранить код выхода:

tomcat="$(ssh [email protected] sudo docker ps -a | grep -w 'my-tomcat')" 
tomcat_status="$?" 

echo "$tomcat_status" 

if [ "$BRANCH" = "tomcat" ] && [ "$tomcat_status" -eq 0 ]; then 
+1

спасибо, что сейчас работает –

+0

Без проблем, рад помочь! – Will

1

Для облегчения отладки, тип set -x перед if -statement и set +x после fi заявления.

Это позволяет отслеживать выполнение, и вы можете увидеть замену на $branch и $?!.

2
[ .. ] && [ "$?" -eq 0 ] 
#   ^This will always be 0, since it's referring to the previous 
#    commands ([ .. ]) exit code 

Храните код выхода из ранее:

tomcat=$(ssh [email protected] sudo docker ps -a | grep -w 'my-tomcat') 
tomcat_exit=$? 

И что $BRANCH? И tomcat?

if [ "$BRANCH" = "$tomcat" ] && [ "$tomcat_exit" -eq 0 ]; then 
#    ^Is this a constant "tomcat" or variable "$tomcat"? 
+0

К сожалению, мы работали над тем же самым ответом в то же время :) – Will