Что означает $@ в сценарии оболочки?
Что означает знак доллара с последующим знаком (@
) значит в скрипте оболочки?
Например:
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]