2011-02-17 18:53:26 +0000 2011-02-17 18:53:26 +0000
83
83

Что такое $* и $# в Linux?

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

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

Ответы (2)

117
117
117
2011-02-17 18:59:34 +0000

От здесь :

$# 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 для подробного описания того, как это имя получается.

0
0
0
2018-09-24 05:34:09 +0000

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

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

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

Похожие вопросы

6
10
5
37
9