Что означает $ @ в сценарии оболочки? - PullRequest
145 голосов
/ 03 апреля 2012

Что означает знак доллара с последующим знаком at (@) в сценарии оболочки?

Например:

umbrella_corp_options $@

Ответы [ 5 ]

196 голосов
/ 03 апреля 2012

$@ - это все параметров, переданных в сценарий.

Например, если вы позвоните ./someScript.sh foo bar, то $@ будет равно foo bar.

Если вы делаете:

./someScript.sh foo bar

, а затем внутри someScript.sh ссылка:

umbrella_corp_options "$@"

это будет передано umbrella_corp_options с каждым отдельным параметром, заключенным в двойные кавычки, что позволяет получать параметры с пробелом от вызывающей стороны и передавать их.

87 голосов
/ 03 апреля 2012

$@ почти совпадает с $*, оба означают «все аргументы командной строки».Они часто используются для простой передачи всех аргументов другой программе (таким образом, формируя оболочку вокруг этой другой программы).

Разница между двумя синтаксисами проявляется, когда у вас есть аргумент с пробелами в нем (например) ипоместите $@ в двойные кавычки:

wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
#     we received them, i. e. as several arguments, each of them
#     containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
#     original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
#     will then split the string as the shell does on the command
#     line, thus it will split an argument containing spaces into
#     several arguments.

Пример: вызов

wrapper "one two    three" four five "six seven"

приведет к:

"$@": wrappedProgram "one two    three" four five "six seven"
"$*": wrappedProgram "one two    three four five six seven"
                             ^^^^ These spaces are part of the first
                                  argument and are not changed.
$*:   wrappedProgram one two three four five six seven
29 голосов
/ 22 октября 2013

Это аргументы командной строки, где:

$@ = сохраняет все аргументы в списке строк
$* = сохраняет все аргументы как одну строку
$# = хранит количество аргументов

9 голосов
/ 03 апреля 2012

Использование чистого $@ означает, что в большинстве случаев «причинишь столько вреда программисту, сколько сможешь», потому что в большинстве случаев это приводит к проблемам с разделением слов, пробелами и другими символами в аргументах.

В (предположении) 99% всех случаев требуется заключить его в ": "$@" - это то, что можно использовать для надежной итерации аргументов.

for a in "$@"; do something_with "$a"; done
6 голосов
/ 03 апреля 2012

Из руководства:

@

Расширяется до позиционных параметров, начиная с единицы.Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово.То есть "$ @" эквивалентно "$ 1" "$ 2" .... Если раскрытие в двойных кавычках происходит внутри слова, расширение первого параметра объединяется с начальной частью исходного слова, иРасширение последнего параметра объединяется с последней частью исходного слова.Когда позиционные параметры отсутствуют, $ @ и $ @ расширяются до нуля (то есть они удаляются).

...