Переменная Unix выглядит как строка, но не - PullRequest
0 голосов
/ 10 октября 2018

У меня есть переменная 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"

1 Ответ

0 голосов
/ 10 октября 2018

Значение $STACK_STATUS - это не

ROLLBACK_COMPLETE

, это

"ROLLBACK_COMPLETE"

Двойные кавычки не являются синтаксисом оболочки, они являются частью вывода команды изначение переменной.

Замените это:

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!
...