首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在条件性检查的同时检查Bash中命令的stdout?

如何在条件性检查的同时检查Bash中命令的stdout?
EN

Stack Overflow用户
提问于 2019-10-25 19:10:42
回答 2查看 148关注 0票数 0

我正在尝试检查命令的输出作为Bash中even循环的一个分离条件,但是它一直跳过块,即使最后一个回显确认值为"DELETE_IN_PROGRESS"

这就是我所拥有的:

代码语言:javascript
运行
复制
stackname=cf_test
while [[ $(aws cloudformation describe-stacks --stack-name ${stackname} | jq '.Stacks | .[0] | .StackStatus') == "DELETE_IN_PROGRESS" ]]; do
  echo -e "   $(aws cloudformation describe-stacks --stack-name ${stackname} | jq '.Stacks | .[0] | .StackStatus'): waiting for current stack to delete before re-deploying..."
  sleep 30
done

echo -e $(aws cloudformation describe-stacks --stack-name ${stackname} | jq '.Stacks | .[0] | .StackStatus')

我该换什么?

编辑:

添加-x调试标志,将提供:

代码语言:javascript
运行
复制
▶ bash -x ~/Downloads/test_script.sh
+ stackname=cf_test
++ aws cloudformation describe-stacks --stack-name cf_test
++ jq '.Stacks | .[0] | .StackStatus'
+ [[ "DELETE_IN_PROGRESS" == \D\E\L\E\T\E\_\I\N\_\P\R\O\G\R\E\S\S ]]
++ aws cloudformation describe-stacks --stack-name cf_test
++ jq '.Stacks | .[0] | .StackStatus'
+ echo -e '"DELETE_IN_PROGRESS"'
"DELETE_IN_PROGRESS"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-26 02:22:22

调试日志显示了问题(尽管[[行本身奇怪地模糊了问题):

代码语言:javascript
运行
复制
+ echo -e '"DELETE_IN_PROGRESS"'

您正在比较的值包含文字双引号。这就是为什么比赛失败的原因。==的右侧包含不作为字符串一部分的语法双引号。

要修复它,使用jq -r输出没有JSON格式和转义的字符串:

代码语言:javascript
运行
复制
json='{ "foo": "bar" }'
jq '.foo' <<< "$json"     # Shows bad 5 character value: "bar"
jq -r '.foo' <<< "$json"  # Shows good 3 character value: bar

就你而言:

代码语言:javascript
运行
复制
while [[ $(aws cloudformation describe-stacks --stack-name ${stackname} | jq -r '.Stacks | .[0] | .StackStatus') == "DELETE_IN_PROGRESS" ]]; doq -r '.Stacks | .[0] | .StackStatus') == "DELETE_IN_PROGRESS" ]]; do
  echo "Still deleting"
  sleep 30
done
票数 1
EN

Stack Overflow用户

发布于 2019-10-25 19:45:45

我会将比较移到jq内部。默认情况下,无论进行比较的逻辑状态如何,jq都会成功。

代码语言:javascript
运行
复制
% jq -n '3 == 3'; echo $?
true
0
% jq -n '3 != 3'; echo $?
false
0

若要更改此选项,请使用-e选项。

代码语言:javascript
运行
复制
% jq -en '3 == 3'; echo $?
true
0
% jq -en '3 != 3'; echo $?
false
1

这样做就不需要[[ ... ]]命令了。

代码语言:javascript
运行
复制
while x=$(aws cloudformation describe-stacks --stack-name ${stackname});
      jq -ne --arg x "$x" '$x.Stacks.[0].StackStatus == "DELETE_IN_PROGRESS"'; do
  printf '%s: waiting for current stack to delete before re-deploying...\n' "$x"
  sleep 30
done

printf '%s\n' "$x"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58564414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档