bash - 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_STATUS
2)如果不是字符串,变量到底是什么?
编辑:附加信息
运行 aws 命令并通过以下方式将结果写入文件:
aws cloudformation describe-stacks --query "Stacks[?StackName == '${STACK_NAME}'].StackStatus | [0]" > aws.out
生成一个包含单行的文件:
"ROLLBACK_COMPLETE"
解决方案
的值$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!
推荐阅读
- python - 如何隐藏代码并重新运行 jupyter 笔记本中的所有单元格?
- spring-boot - 使用 Mockito 使用 @Transactional 方法模拟一个类
- mysql - Node js Mysql查询IN子句和字符串数组
- javascript - 更改在 d3 中绘制数据的顺序
- java - getResource() nullPointerException
- python - 如何在 Django HttpResponseRedirect() 方法中指定 HTTP 方法
- python - 如何从python将命令添加到bash历史记录
- python - 我如何使用 groupby 或重新采样对具有严重性或严重性的警报进行每日计数
- html - 在标题之后,将点设置到页面边缘
- python - 如何不重新加载Spacy?