$ {1: + "$ @" } в/bin/sh
Я заметил, что иногда скрипты-оболочки используют ${1:+"[email protected]"}
для параметров, а не только "[email protected]"
.
Например, http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh использует
exec "$binary" $opts ${1:+"[email protected]"}
Может ли кто-нибудь сломать ${1:+"[email protected]"}
на английский язык и объяснить, почему это было бы преимуществом по сравнению с обычным "[email protected]"
?
Ответы
Ответ 1
"Истерические изюм", иначе исторические причины.
Объяснение от JesperE (или справочной страницы Bash) является точной для того, что он делает:
Если существует $1 и не является пустой строкой, замените цитированный список аргументов.
Когда-то 20 лет назад некоторые сломанные второстепенные варианты Bourne Shell заменили пустую строку "на" [email protected]", если не было никаких аргументов вместо правильного текущего поведения подстановки ничего. Независимо от того, все ли такие системы все еще используются, можно обсуждать.
[Хм: это расширение не будет работать правильно:
command '' arg2 arg3 ...
В этом контексте правильная нотация:
${1+"[email protected]"}
Это правильно работает, является ли $1 пустым аргументом или нет. Итак, кто-то неправильно вспомнил обозначение, случайно введя ошибку.]
Ответ 2
На странице bash man:
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is
substituted, otherwise the expansion of word is substituted.
Итак, "[email protected]"
заменяется, если $1
не установлен. Я не понимаю, почему они просто не могли использовать "[email protected]"
.
Ответ 3
Процитировать соответствующую часть man bash
для информации, которую Джонатан Леффлер упоминает в своем комментарии:
Если не выполняется расширение подстроки, bash проверяет недействительный или нулевой параметр; опускание двоеточия приводит к тесту только для параметра, который не задан.
(акцент мой)