Подтвердить что ты не робот

Что означает [email protected]в оболочке script?

Что означает знак доллара, за которым следует знак at (@) в оболочке script?

Например:

umbrella_corp_options [email protected]
4b9b3361

Ответ 1

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

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

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

./someScript.sh foo bar

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

umbrella_corp_options "[email protected]"

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

Ответ 2

[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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

@

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