$ {1: + "$ @"} в / bin / sh - PullRequest
       61

$ {1: + "$ @"} в / bin / sh

24 голосов
/ 30 сентября 2008

Я заметил, что иногда сценарии-оболочки будут использовать ${1:+"$@"} для параметров, а не просто "$@".

Например, http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh использует

exec "$binary" $opts ${1:+"$@"}

Может ли кто-нибудь перевести ${1:+"$@"} на английский и объяснить, почему это будет преимуществом перед простым "$@"?

Ответы [ 3 ]

18 голосов
/ 01 октября 2008

«Истерические изюминки», иначе исторические причины.

Объяснение JesperE (или справочной страницы Bash) точно соответствует тому, что он делает:

Если $ 1 существует и не является пустой строкой, подставьте список аргументов в кавычках.

Когда-то лет 20 назад или около того некоторые неработающие варианты оболочки Bourne Shell заменяли пустую строку "" на "$ @", если не было аргументов, вместо правильного текущего поведения замены ничего. Вопрос о том, используются ли какие-либо из этих систем, пока остается открытым.

[Хмм: это расширение не будет работать правильно для:

command '' arg2 arg3 ...

В этом контексте правильное обозначение:

${1+"$@"}

Это работает правильно, независимо от того, является ли $ 1 пустым аргументом или нет. Итак, кто-то неправильно запомнил запись, случайно введя ошибку.]

3 голосов
/ 21 октября 2009

Цитировать соответствующую часть man bash для информации, на которую Джонатан Леффлер ссылается в своем комментарии:

Если расширение подстроки не выполняется, bash тестирует параметр, который unset или null ; без двоеточия приводит к проверке только для параметра, который unset .

(акцент мой)

2 голосов
/ 30 сентября 2008

со страницы руководства bash:

   ${parameter:+word}
          Use Alternate Value.  If parameter is null or unset, nothing  is
          substituted, otherwise the expansion of word is substituted.

Итак, "$@" заменяется, если $1 не установлено. Я не понимаю, почему они не могли просто использовать "$@".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...