Что означает "плюс двоеточие" ( "+:" ) в выражениях оболочки script?

Что это значит?

if ${ac_cv_lib_lept_pixCreate+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS

Похож, что ac_cv_lib_lept_pixCreate - это какая-то переменная, так что означает +:?

Где узнать полный синтаксис фигурных скобок? Каково имя этого синтаксиса?

Ответ 1

В выражении "плюс двоеточие" ${...+:} только текст + имеет особое значение в оболочке. Двоеточие - это просто строковое значение в этом случае, поэтому мы могли бы написать этот фрагмент как ${...+":"}.

Для удобства пусть притворяется, что переменная называется var, и рассмотрим выражение:

if ${var+:} false; then ...

Если переменная оболочки $var существует, все выражение заменяется на :, если нет, оно возвращает пустую строку.

Поэтому все выражение ${var+:} false становится либо : false (возвращает true), либо false (возвращает false).

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

Это очень загадочно, но, как это бывает, является одним из немногих тестов для существования переменной, которая фактически работает в большинстве, если не во всех, оболочках спуска Борна.

Возможные эквиваленты: (замените здесь любое имя переменной для var)

if [[ ${var+"is_set"} == is_set ]]; then ...

Или, возможно, более портативный:

case ${var+"IS_SET"} in IS_SET) ...;; esac

Ответ 2

Документация по расширению параметров оболочки для bash здесь. Не упоминается +:, хотя упоминается :+:

${parameter:+word}
Если параметр имеет значение null или не задан, ничто не заменяется, иначе заменяется слово.

Ответ 3

Чтобы проиллюстрировать сказанное:

Отменить переменную (обратите внимание на пустые строки в результате некоторых команд echo):

$ unset foo
$ echo ${foo}

$ echo ${foo:+:}

$ echo ${foo+:}

Нулевая переменная:

$ foo=""
$ echo ${foo}

$ echo ${foo:+:}

$ echo ${foo+:}
:

Непустая переменная:

$ foo="bar"
$ echo ${foo}
bar
$ echo ${foo:+:}
:
$ echo ${foo+:}
:

Ответ 4

Простые примеры докажут

Я проверяю наличие параметра TEST, если присутствует эхо "Да", иначе я повторяю "Нет"

openvas:~$ ${TEST+:} false  &&  echo "yes" || echo "no"
no
openvas:~$ TEST=1
openvas:~$ ${TEST+:} false  &&  echo "yes" || echo "no"
yes
openvas:~$ 

Если вы видите, параметр TEST оценивается, и он фактически не установлен, поэтому он возвращает false и выходит из пути и переходит к OR После того, как я установил то же самое и снова проверил, он перетекает в часть эха (продолжение & &), поскольку возвращает true

Обратитесь: this и который