В чем смысл вопросительного знака в расширении переменных bash, как в ${var?}?

В чем смысл переменной bash, используемой следующим образом:

 ${Server?}

Ответы

Ответ 1

Он работает почти так же, как (из bash manpage):

${parameter:?word}
Display Error if Null or Unset. If parameter is null or unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

Этот конкретный вариант проверяет, существует ли переменная (она определена и не равна нулю). Если это так, он использует его. Если нет, он выдает сообщение об ошибке, указанное word (или подходящее, если нет word) и завершает script.

Фактическая разница между этой версией и версией не-двоеточия может быть найдена в man-странице bash выше указанного раздела:

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

Другими словами, приведенный выше раздел может быть изменен для чтения (в основном, выбирая "нулевые" биты):

${parameter?word}
Display Error if Unset. If parameter is unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

Различие показано таким образом:

pax> unset xyzzy ; export plugh=

pax> echo ${xyzzy:?no}
bash: xyzzy: no

pax> echo ${plugh:?no}
bash: plugh: no

pax> echo ${xyzzy?no}
bash: xyzzy: no

pax> echo ${plugh?no}

pax> _

Там вы можете видеть, что, хотя и unset, и null-переменная приводят к ошибке с :?, только неустановленные ошибки с ?.

Ответ 2

Это означает, что script должен прервать, если переменная не определена

Пример:

#!/bin/bash
echo We will see this
${Server?Oh no! server is undefined!}
echo Should not get here

Этот script будет печатать первое эхо и сообщение об ошибке "О нет!...".

Смотрите все замены переменных для bash здесь: http://tldp.org/LDP/abs/html/parameter-substitution.html