在if语句中使用netcat表达式的Bash脚本

时间:2015-10-08 13:02:51

标签: bash

我有一个脚本,我用它来帮助我从here获得的名为wait_to_start.sh的docker-compose编排:

#!/bin/bash

echo $WAIT_COMMAND
echo $WAIT_START_CMD

is_ready() {
    eval "$WAIT_COMMAND"
}

# wait until is ready
i=0
while ! is_ready; do
    i=`expr $i + 1`
    if [ $i -ge $WAIT_LOOPS ]; then
        echo "$(date) - still not ready, giving up"
        exit 1
    fi
    echo "$(date) - waiting to be ready"
    sleep $WAIT_SLEEP
done

#start the script
exec $WAIT_START_CMD

但是,我无法正常工作。我想使用netcat来测试服务是否正在运行。

couchbase:
  container_name: couchbase
  image: couchbase/server:community-3.0.1
  volumes:
    - /opt/couchbase/var:/opt/couchbase/var
  ports:
    - "8091:8091"

myapp:
  container_name: myapp
  image: myapp
  command: wait_to_start.sh
  volumes_from:
    - couchbase
  links:
    - couchbase:couchbase
  environment:
    - WAIT_COMMAND=[ `nc -z -w3 localhost 8091` -eq 0 ]
    - WAIT_START_CMD=mycmd
    - WAIT_SLEEP=2
    - WAIT_LOOPS=10

但它不起作用。

当我在命令行上直接运行netcat时,它可以工作。成功时返回0。以上都不起作用。

我得到了:

bash: [: =: unary operator expected

所以我玩了一遍,发现回显WAIT_COMMAND会产生

[ -eq 0 ]

我做错了什么?我是一个bash noob。一定很简单。

2 个答案:

答案 0 :(得分:1)

而不是

WAIT_COMMAND=[ nc -z -w3 localhost 8091 -eq 0 ] 

只需使用

WAIT_COMMAND="nc -z -w3 localhost 8091"

评估程序的返回代码不需要[命令。

答案 1 :(得分:1)

感谢提示和评论以及大量实验。 最终有效的是:

[ $(nc -z -w3 couchbase 11211; echo $?) -eq 0 ]

我还发现,如果我尝试直接在脚本中设置WAIT_COMMAND来测试它,它会尽早得到评估。所以我不得不使用单引号。

WAIT_COMMAND='[ $(nc -z -w3 couchbase 11211; echo $?) -eq 0 ]'

在docker-compose.yml中,它看起来像这样:

environment:
    WAIT_COMMAND=[ $(nc -z -w3 couchbase 11211; echo $?) -eq 0 ]

或者简单地说:(谢谢Etan!)

WAIT_COMMAND="! nc -z -w3 couchbase 11211"