$ {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 проверяет недействительный или нулевой параметр; опускание двоеточия приводит к тесту только для параметра, который не задан.

(акцент мой)