我在 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$'
)