Що таке $ * і $ # в Linux?


76

Що означають такі змінні середовища в Linux?

  1. Що таке $ * (знак долара, за яким слідує зірочка)?
  2. Що таке $ # (знак долара поруч із знаком хеш / знаком числа / знаком octothorpe / pound)?

Відповіді:


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

Це частина Стандарт POSIX і повинні підтримуватися всіма сумісними оболонками. Нижче наведені визначення стандарту POSIX для кожного спеціального параметра. Зверніть увагу на три додаткові змінні: $-, $$ і $!.

$@:

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

$*:

Розгортається до позиційних параметрів, починаючи з одного. Коли розширення відбувається в межах подвійного цитованого рядка (див Подвійні цитати ), він повинен розширюватися до одного поля зі значенням кожного параметра, розділеного першим символом змінної IFS, або a, якщо IFS не встановлено. Якщо IFS встановлено в нульовий рядок, це не еквівалентно виключенню; його перший символ не існує, тому значення параметра об'єднуються.

$#:

Розширюється до десяткового числа позиційних параметрів. Ім'я команди (параметр 0) не підраховується в число, яке задається символом "#", оскільки це спеціальний параметр, а не позиційний параметр.

$?:

Розгортається до десяткового статусу виходу останнього конвеєра (див Трубопроводи ).

$-:

(Дефіс.) Розгортається до поточних прапорців опцій (імена однобуквених варіантів, об'єднаних у рядок), як вказано для виклику, набір спеціальна вбудована команда або неявно оболонка.

$$:

Розгортається до десяткового ідентифікатора процесу викликаної оболонки. У добовій оболонці (див Середовище виконання оболонки ), '$' розширюється до того ж значення, що і поточна оболонка.

$!:

Розгортається до десяткового ідентифікатора процесу останньої фонової команди (див Списки ) виконується з поточної оболонки. (Наприклад, фонові команди, що виконуються з дочірніх оболонок, не впливають на значення "$!" У поточному середовищі оболонки.) Для конвеєра, ідентифікатор процесу - це останній в конвеєрі.

$0:

(Нуль.) Розгортається до імені оболонки або сценарію оболонки. Подивитися sh для детального опису того, як отримано це ім'я.


1
Ці спеціальні параметри є істинними у всіх оболонках Борна (наприклад, sh, bash, dash, ash, ksh, zsh).
Dennis Williamson

Виправлення: $* і $# 1) змінні оболонки, а не змінні середовища; 2) стандартизовані (частина специфікації POSIX)
grawity

3
Також зверніть увагу на це "$@" багато разів написано як ${1+"$@"} (з причин переносимості) див stackoverflow.com/questions/743454/… для пояснення.
hlovdal

Оскільки 'ім'я команди (параметр 0) не підраховується ...', у наведеному вище прикладі має бути $ # = 2, починаючи відлік від 0.
Josef Klimuk

0

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

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

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

2
Ласкаво просимо до Суперкористувача. Сайт є базою знань, тому метою є те, щоб кожна відповідь надавала вирішення питання, яке ще не було внесено. Це стосується лише половини питання, і інформація вже добре висвітлена в попередній відповіді.
fixer1234
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.