Intereting Posts
Как сортировать файлы по части имени файла? Использование ack для эффективного поиска и каталог проекта RStudio Как настроить Ethernet? Автоматическое управление белым списком (например, в tinyproxy) динамических IP-адресов? Низкая скорость записи (<2 МБ / с) в незашифрованных и зашифрованных LUKS файловых системах ext4 с использованием программного обеспечения mdadm RAID1 Debian 8 Сервер Dell PowerEdge T330 сравнение значений в отдельных столбцах Httpd не может получить доступ к файлу даже после установки httpd_sys_content_t Сделать X11 на «dev / input / eventx»? Учитывая команду * nix, как мне найти, где находится исполняемый файл? Есть ли более простой способ grep всех файлов в каталоге? как я могу назвать команды git без «git» впереди? Настройка разрешений для общей папки шрифты не работают на новой установке gentoo Различные методы получения SHA1 дают разные результаты Chrome, Linux Mint, Low FPS в играх

Подстановка параметров

Я хочу знать разницу между следующими двумя вариантами замены параметров в Linux.

echo ${MESG:? "HI"} echo ${MESG:- "HI"} 

Кажется, они оба делают одно и то же.

Из руководства по bash ( стандарт POSIX имеет аналогичную формулировку):

${parameter:-word} : использовать значения по умолчанию . Если parameter не установлен или ноль, расширение word заменяется. В противном случае значение parameter подставляется.

${parameter:?word} : Показать ошибку, если ноль или не установлен . Если parameter равен нулю или не задан, расширение word (или сообщение на этот счет, если word отсутствует) записывается со стандартной ошибкой, и shell, если она не является интерактивной, завершается. В противном случае значение parameter подставляется.

Если ваша переменная MESG является ненулевой строкой символов, они будут делать то же самое (расширить до значения переменной MESG ). Если он пуст или вообще не установлен, то ${MESG:-HI} будет заменен строкой HI , а ${MESG:?HI} отобразит HI при стандартной ошибке и выйдет из текущего сеанса оболочки (если это не интерактивный сессия).

Если MESG не установлен, то

 echo ${MESG:?} 

будет печатать

 MESG: parameter null or not set echo ${MESG:-} 

будет печатать

  

? и – поэтому диктует, как обращаться с нулевыми или не заданными переменными