Ответ 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-переменная приводят к ошибке с :?
, только неустановленные ошибки с ?
.