Как ведет себя ${SOME_VAR+x}? Может ли он потерпеть неудачу в файле .sh?

Я отлаживаю скрипт sh. Каково поведение этих строк кода?

SOME_VAR=$(env)

if [ ! -z ${SOME_VAR+x} ]; then
    echo "SOMETHING HAPPENED "
fi

Что означает +x в данном случае? Получается, что с bash код работает нормально, а с sh нет.

EDIT: я работаю над развертыванием локального экземпляра Eclipse Che, как это объяснено здесь.

Я установил Eclipse Che CLI, который представляет собой сценарий .sh:

$ curl -sL https://raw.githubusercontent.com/eclipse/che/master/che.sh > /usr/local/bin/che
$ chmod +x /usr/local/bin/che

Чтобы заставить его работать, мне нужно запустить его, используя bash:

$ bash che start

Если я отлаживаю скрипт...

$ sh -x che start 

Скрипт не работает здесь:

get_list_of_che_system_environment_variables() {

    [...]

    if [ ! -z ${CHE_VARIABLES+x} ]; then
      env | grep CHE_ >> $DOCKER_ENV
      RETURN=$DOCKER_ENV
    fi

Что-то не работает. Если вы скажете, что подстановка должна работать и в .sh, в чем может быть проблема?


person JonDoe297    schedule 24.08.2016    source источник
comment
Код должен работать одинаково в любой POSIX-совместимой оболочке.   -  person chepner    schedule 25.08.2016
comment
Что означает, что код не работает с sh? Все команды действительны в sh.   -  person    schedule 25.08.2016
comment
@redmm Я отредактировал свой вопрос, чтобы показать вам, в чем может быть проблема.   -  person JonDoe297    schedule 25.08.2016


Ответы (2)


${SOME_VAR+x} заменяется пустой строкой, если SOME_VAR не установлено. Если он установлен (даже для пустой строки), он расширяется до x.

Поскольку в предыдущей строке было установлено SOME_VAR, оно всегда будет расширяться до x. Это делает оператор if неуместным, так как код всегда будет выводить SOMETHING HAPPENED.

person chepner    schedule 25.08.2016

Это форма подстановки параметров, которая дает x, если установлено SOME_VAR, или нулевую строку, если это не так.

Вы можете узнать больше о различных типах подстановки параметров здесь.

person Aaron    schedule 25.08.2016