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

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

Например:

umbrella_corp_options $@

9 ответов

Решение

$@ это все параметры, переданные в скрипт.

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

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

./someScript.sh foo bar

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

umbrella_corp_options "$@"

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

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

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

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

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

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

Смысл.

Вкратце, $@расширяется до позиционных аргументов, переданных от вызывающего объекта функции или сценарию. Его значение зависит отконтекста: внутри функции он расширяется до аргументов, переданных в такую ​​функцию. Если используется в сценарии (не внутри области видимости функции), он расширяется до аргументов, переданных в такой сценарий.

$ cat my-sh
#! /bin/sh
echo "$@"

$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!

Разделение слов.

Теперь еще одна тема, которая имеет первостепенное значение для понимания того, как $@в оболочке ведет себя разбиение слов. Оболочка разделяет токены на основе содержимогоIFSпеременная. Его значение по умолчанию\t\n; т.е. пробелы, табуляция и новая строка.

Расширение "$@"дает вам точную копию переданных аргументов. Однако расширение$@будет не всегда. В частности, если аргументы содержат символы изIFS, они разделятся.


В большинстве случаев вы захотите использовать "$@"не $@.

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

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

for a in "$@"; do something_with "$a"; done

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

@

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

«Все аргументы, переданные в функцию», меня сильно обожгло в начале.

Он не включает $0, имя сценария, который передается (не так ли?) в программу, хотя и неявно.

$@в основном используется для ссылки на все аргументы командной строки сценария оболочки. $1 , $2 , $3относятся к первому аргументу командной строки, второму аргументу командной строки, третьему аргументу.

Они часто используются для простой передачи всех аргументов в другую программу.

[ shell]# ./my-script hi 11 33hi 11 33[ [email protected][email protected]

Другие вопросы по тегам