Что такое $* и $# в Linux?
Что означают следующие переменные окружения в Linux?
- Что такое $* (знак доллара со звездочкой)?
- Что такое $# (знак доллара рядом со знаком хэша/знаком числа/знаком октотропа/фунта)?
Что означают следующие переменные окружения в Linux?
От здесь :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
Так что, по сути, $#
- это количество аргументов, приведенных при выполнении вашего скрипта. $*
это строка, содержащая все аргументы. Например, $1
является первым аргументом и так далее. Это полезно, если вы хотите получить доступ к конкретному аргументу в вашем скрипте.
Как прокомментировал Брайан, вот простой пример. Если вы запустите следующую команду:
./command -yes -no /home/username
$#
= 3 $*
= -yes -no /home/username
$@
= массив: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
и др. Они являются частью стандарта POSIX и должны поддерживаться всеми совместимыми оболочками. Для справки ниже приведены определения POSIX-стандартов для каждого специального параметра. Обратите внимание, что есть три дополнительные переменные: $-
, $$
и $!
.
$@
:
Расширяется до позиционных параметров, начиная с одного. Когда расширение происходит в двойных кавычках, и где выполняется разделение полей (см. Разделение полей ), каждый позиционный параметр расширяется как отдельное поле, при условии, что расширение первого параметра все равно соединяется с начальной частью исходного слова (в предположении, что расширенный параметр был вложен в слово), а расширение последнего параметра все равно соединяется с последней частью исходного слова. Если позиционных параметров нет, то расширение ‘@’ должно генерировать нулевые поля, даже если ‘@’ заключено в двойные кавычки.
$*
:
Расширение до позиционных параметров, начиная с единицы. Когда расширение происходит внутри строки в двойных кавычках (см. Double-Quotes ), оно должно расширяться до одного поля со значением каждого параметра, разделенного первым символом переменной IFS, или, если IFS не задан. Если IFS установлена в нулевую строку, то это не эквивалентно ее сбрасыванию; ее первый символ не существует, поэтому значения параметров конкапсулируются.
$#
:
Разворачивается до десятичного числа позиционных параметров. Имя команды (параметр 0) не должно засчитываться в число, заданное ‘#’, поскольку это специальный параметр, а не позиционный параметр.
$?
:
Расширяется до десятичного состояния выхода последнего трубопровода (см. Конвейеры ).
$-
:
(Hyphen.) Развертывает до флагов текущей опции (имена опций, состоящих из одной буквы и соединенных в строку), как указано при вызове, специальной встроенной командой set , или неявно оболочкой.
$$
:
Развертывает десятичный идентификатор процесса вызываемой оболочки. В подоболочке (см. Shell Execution Environment ), ‘$’ должен быть развернут до того же значения, что и текущая оболочка.
$!
:
Развернется до десятичного идентификатора процесса последней фоновой команды (см. Списки ), выполненной из текущей оболочки. (Например, фоновые команды, выполняемые из подоболочки, не влияют на значение “$!” в текущем окружении оболочки). Для конвейера идентификатором процесса является идентификатор последней команды в конвейере.
$0
:
(Ноль.) Разворачивается на имя скрипта оболочки или оболочки. Смотрите раздел sh для подробного описания того, как это имя получается.