it-swarm.com.ru

Что означает $ @ в сценарии Shell?

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

Например:

umbrella_corp_options [email protected]
141
trusktr

[email protected] - это все параметров, переданных в сценарий.

Например, если вы вызываете ./someScript.sh foo bar, тогда [email protected] будет равен foo bar.

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

./someScript.sh foo bar

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

umbrella_corp_options "[email protected]"

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

192
Har

[email protected] почти такой же, как $*, оба означают "все аргументы командной строки". Они часто используются для простой передачи всех аргументов другой программе (таким образом, формируя оболочку вокруг этой другой программы).

Разница между этими двумя синтаксисами проявляется, когда у вас есть аргумент с пробелами в нем (например,) и [email protected] в двойных кавычках:

wrappedProgram "[email protected]"
# ^^^ 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"

приведет к:

"[email protected]": 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
86
Alfe

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

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

28
Sameer Duwal

Использование чистого [email protected] в большинстве случаев означает "причинить столько вреда программисту, сколько вы можете", потому что в большинстве случаев это приводит к проблемам с разделением Word и с пробелами и другими символами в аргументах.

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

for a in "[email protected]"; do something_with "$a"; done
9
glglgl

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

@

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

6
Christoffer Hammarström