我有一个变量STACK_STATUS,该变量从命令中分配了一个值,但是我似乎无法识别出该值的确切含义。它似乎是一个字符串,但是如果使用等效字符串进行相等性测试,则它将返回false。具体情况:
STACK_STATUS=$(aws cloudformation describe-stacks --query "Stacks[?StackName == '${STACK_NAME}'].StackStatus | [0]")
在这种情况下,echo $STACK_STATUS
返回"ROLLBACK_COMPLETE"
,但是[ ${STACK_STATUS} == "ROLLBACK_COMPLETE" ]; echo $?
返回1
(如果相同,则应返回零)。最初,我认为这与多余的引号有关,但是我尝试了使用不同级别的引号的多个版本,但此版本不匹配。
因此,当我尝试编写如下命令时:
case "$STACK_STATUS" in
null)
echo "stack does not exist, creating it"
echo "do some stuff"
;;
ROLLBACK_COMPLETE)
echo "stack is in ROLLBACK_COMPLETE, deleting and rebuilding"
echo "do some other stuff"
;;
*)
echo "updating stack with stack status: $STACK_STATUS"
echo "do extra stuff"
;;
esac
在这种情况下,它缺少ROLLBACK_COMPLETE
情况,并直接回显"updating stack with stack status: ROLLBACK_COMPLETE"
。这显然不是预期的行为。
1)如何解决此问题,以便case语句正确捕获ROLLBACK_COMPLETE大小写?
2)如果不是字符串,$STACK_STATUS
变量到底是什么?
编辑:附加信息
运行aws命令并将结果通过以下方式写入文件:
aws cloudformation describe-stacks --query "Stacks[?StackName == '${STACK_NAME}'].StackStatus | [0]" > aws.out
产生一个包含单行的文件:
"ROLLBACK_COMPLETE"
答案 0 :(得分:1)
ROLLBACK_COMPLETE
的值不是
"ROLLBACK_COMPLETE"
是
ROLLBACK_COMPLETE)
双引号不是shell语法,它们是命令输出和变量值的一部分。
替换此:
'"ROLLBACK_COMPLETE"')
由此:
#!/bin/bash
STACK_STATUS='"ROLLBACK_COMPLETE"'
echo "STACK_STATUS=$STACK_STATUS"
case "$STACK_STATUS" in
ROLLBACK_COMPLETE)
echo "This doesn't match"
;;
"ROLLBACK_COMPLETE")
echo "Neither does this"
;;
'"ROLLBACK_COMPLETE"')
echo "BINGO!"
;;
*)
echo "Something else?"
;;
esac
这是一个演示以下内容的小脚本:
STACK_STATUS="ROLLBACK_COMPLETE"
BINGO!
输出:
.photo { display: flex; }