Відповіді:
Від тут :
$# 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) змінні оболонки, а не змінні середовища; 2) стандартизовані (частина специфікації POSIX)
"$@"
багато разів написано як ${1+"$@"}
(з причин переносимості) див stackoverflow.com/questions/743454/… для пояснення.
$#
представляє число аргументів:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3