76

Что означают следующие переменные среды в Linux?

  1. Что такое $ * (знак доллара, сопровождаемый звездочкой)?
  2. Что такое $ # (знак доллара рядом с хеш-знаком / знаком числа / октоторпа / знака фунта)?

2 ответа2

106

Отсюда:

$#    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
  • $@ = array: {"-yes", "-no", "/home/username"}
  • $0 = ./command , $1 = -yes и т.д.

Они являются частью стандарта POSIX и должны поддерживаться всеми совместимыми оболочками. Для справки ниже приведены стандартные определения POSIX для каждого специального параметра. Обратите внимание, что есть три дополнительные переменные: $- , $$ и $! ,

$@:

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

$*:

Расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в строке с двойными кавычками (см. Двойные кавычки), оно должно быть расширено до одного поля со значением каждого параметра, разделенного первым символом переменной IFS или если IFS не установлен. Если для IFS задана нулевая строка, это не эквивалентно ее отмене; его первый символ не существует, поэтому значения параметров объединяются.

$#:

Расширяется до десятичного числа позиционных параметров. Имя команды (параметр 0) не должно учитываться в числе, указанном в «#», потому что это специальный параметр, а не позиционный параметр.

$?:

Расширяется до десятичного состояния выхода самого последнего конвейера (см. Конвейеры).

$-:

(Дефис.) Расширяется до флагов текущей опции (имена букв из одной буквы объединяются в строку), как указано при вызове, с помощью специальной встроенной команды set или неявно с помощью оболочки.

$$:

Расширяется до десятичного идентификатора процесса вызванной оболочки. В подоболочке (см. Среда выполнения оболочки ) значение $ должно быть таким же, как и у текущей оболочки.

$!:

Расширяется до десятичного идентификатора процесса самой последней фоновой команды (см. Списки), выполняемой из текущей оболочки. (Например, фоновые команды, выполняемые из подоболочек, не влияют на значение «$!"в текущей среде оболочки.) Для конвейера ID процесса - это последняя команда в конвейере.

$0:

(Нуль.) Расширяется до имени оболочки или сценария оболочки. Смотрите sh для подробного описания того, как происходит это имя.

0

$# представляет количество аргументов:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .