首页 > 解决方案 > Unix 变量看起来像一个字符串,但不是

问题描述

我有一个变量 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 案例?

$STACK_STATUS2)如果不是字符串,变量到底是什么?

编辑:附加信息

运行 aws 命令并通过以下方式将结果写入文件:

aws cloudformation describe-stacks --query "Stacks[?StackName == '${STACK_NAME}'].StackStatus | [0]" > aws.out

生成一个包含单行的文件:

"ROLLBACK_COMPLETE"

标签: bashunixswitch-statement

解决方案


的值$STACK_STATUS不是

ROLLBACK_COMPLETE

它是

"ROLLBACK_COMPLETE"

双引号不是 shell 语法,它们是命令输出和变量值的一部分。

替换这个:

ROLLBACK_COMPLETE)

这样:

'"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!

推荐阅读