如何在 Buildspec、Codebuild、AWS 中从 STDOUT 声明数组

如何在 Buildspec、Codebuild、AWS 中从 STDOUT 声明数组

我在 Buildspec 中的 STDOUT 声明数组时遇到问题,Buildspec 是 AWS 中 Codebuild 的一部分。 使用 Pure Bourne Shell 构建规范,因此我无法在代码中使用此行declare -a available_envs=($(eb list --all))available_envs=($(eb list --all))

some build command...

eb list --all # list all created env in Elastic Beanstalk

declare -a available_envs=($(eb list --all)) # <<< here is a problem because I can't create array this way.
echo ${available_envs[@]} # <<< checking if variabla have all available env 

if [[ ${available_envs[*]} =~ 'develop' ]]; then
    echo 'Develop environment is allready created.'
    else
        echo "Creating Develop environment..."
        eb create develop
fi

some build command...

先感谢您。


编辑:

命令输出eb list --all

develop
production
stage

解决方案:感谢@faho 改变观点。

grep我在命令之前稍微修剪一下输出

some build command...
envs=$(eb list --all | tr -d " \t\r" | tr -d [*] | grep "develop")
echo ${envs}

if [ "${envs}" = "develop" ]; then
        echo 'Develop environment is already created.'
        else
                echo "Creating Develop environment..."
fi
some build command...

答案1

Posix sh 既没有任意数组变量也没有[[ .. ]]条件。它具有位置参数 ,$@但是设置它(使用set)不会对您有太大帮助,因为您在这里的比较也不起作用。

所以这需要不同的思维方式。您需要弄清楚您想用这个输出做什么并采取相应的行动。

按照您目前的代码,您可以这样做

if eb list --all | grep -q develop; then

如果您再次需要输出并且不想eb list --all再次调用,可以将其作为一个字符串保存到变量中,然后稍后使用,例如

envs=$(eb list --all)

if printf '%s\n' "$envs" | grep -q develop; then

(注意:grep -q develop将匹配任何包含子字符串“develop”的行。如果不需要,您可能需要grep -q '^develop$'

相关内容