Как проверить значение конфигурации git в операторе Bash if / else? - PullRequest
1 голос
/ 25 января 2020

Я пытаюсь прочитать значение конфигурации git в сценарии bash и условно действовать в зависимости от того, true или false.

. Я ожидаю, что быть в состоянии сделать:

if [ $(git config --get myvalue) ]; then
   echo "True"
else
   echo "False"
fi

Однако, когда я запускаю приведенный выше пример, True всегда печатается всегда . Кажется, что прямое сравнение значения с true работает правильно, например:

if [ $(git config --get myvalue) = true ]; then
   echo "True"
else
   echo "False"
fi

Однако большинство языков программирования не требуют прямого сравнения с логическим значением, так что это идет вразрез с тем, что ожидайте.

На самом деле это выглядит так:

if $(git config --get myvalue); then
   echo "True"
else
   echo "False"
fi

Насколько я понимаю, помещение выражения в [ ] вызывает команду test под капотом. Однако для меня не очевидно, почему логическое выражение не оценивается должным образом с помощью test.

Почему [ ] не оценивает выражение правильно?

1 Ответ

5 голосов
/ 25 января 2020

Bash не имеет логических переменных. true является строкой и может быть записано как "true" или 'true' без изменения семантики. Нормально и правильно явно сравнивать его с true или false.

if [[ $(git config --get myvalue) == true ]]; then
   echo "True"
else
   echo "False"
fi

if $(git config --get myvalue); then
   echo "True"
else
   echo "False"
fi

Не делайте этого. Это серьезная уязвимость безопасности. Что он на самом деле делает, выполняя любую команду git config выводит. Это работает, потому что есть команды с именами true и false, которые успешно и неудачно, соответственно.

Что если эта команда не была true или false? Что если кто-то заменит myvalue на rm -rf /? Вы бы плохо провели время ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...