Каковы специальные переменные оболочки знака доллара?

783

В Bash, по-видимому, есть несколько переменных, которые содержат специальные значения, имеющие постоянное значение. Например,

./myprogram &; echo $!

вернет PID процесса, который в фоновом режиме myprogram. Я знаю о других, таких как, $?я думаю, нынешний TTY. Есть ли другие?

Z Дуглас
источник
15
Некоторые из них не только для Bash. Они также используются в других оболочках, связанных с Bourne, и фактически определяются POSIX .
Приостановлено до дальнейшего уведомления.
1
Как насчет: IFS = $ '\ n' См .: stackoverflow.com/questions/4128235/…
sgu
1
@sgu Это не параметр; это особый тип цитирования. $'\n'буквальный символ новой строки, полученный в результате замены орграфа \nна ASCII 10.
chepner
Если вы пришли сюда в поисках ${1}, ${*}и т.д., скобка только для устранения неоднозначности, и часто избыточна. В изоляции, ${x}в точности соответствует $x.
tripleee
Что $!значит? Я знаю, !$но не это.
Шридхар Сарнобат

Ответы:

1361
  • $1, $2, $3, ... являются позиционными параметрами .
  • "$@"представляет собой массив, как конструкция всех позиционных параметров, {$1, $2, $3 ...}.
  • "$*"является расширением МФСА всех позиционных параметров, $1 $2 $3 ....
  • $# количество позиционных параметров.
  • $- текущие параметры, установленные для оболочки.
  • $$ pid текущей оболочки (не subshell).
  • $_ самый последний параметр (или путь abs команды для запуска текущей оболочки сразу после запуска).
  • $IFS является (входным) разделителем полей.
  • $? самый последний статус выхода на передний план трубопровода.
  • $! PID самой последней фоновой команды.
  • $0 имя оболочки или сценария оболочки

Большинство из вышеперечисленного можно найти в разделе « Специальные параметры» справочного руководства Bash. Есть все переменные окружения, установленные оболочкой .

Подробный указатель приведен в справочном руководстве Переменный указатель .

Кодзиро
источник
2
Все они описаны в bashсправочной странице. Единственная странность в том, что $_она упоминается только в контексте ее использования в MAILPATHпеременной.
Чепнер
4
@chepner поищите в man(1) bashразделе « Специальные параметры» остальную часть определения $_.
Кодзиро
8
Я использую !$вместо $_сценариев bash, потому что последний иногда дает сбой.
утра
Хороший список коджиро. Я столкнулся с этим синтаксисом $ {1 + "$ @"}, что это значит?
user178047
3
@amc: См. unix.stackexchange.com/questions/271659/… для различий между !$и $_.
трикассе
44
  • $_ последний аргумент последней команды
  • $# количество аргументов, переданных в текущий скрипт
  • $*/ $@список аргументов, передаваемых скрипту в виде строки / списка с разделителями

с верхней части моей головы. Google для Bash специальных переменных.

Дэн
источник
124
"Я сделал. Они послали меня сюда." - Книжный скит (официальный документ: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo
1
Я думаю, что $@это строка и $*список с разделителями (в любом случае согласно принятому выше ответу).
RastaJedi
1
@RastaJedi: "$@"разворачивается в список, "$*"разворачивается в одну строку. Особое поведение $@применяется, когда оно находится в двойных кавычках.
Кит Томпсон
6
Проголосовал, потому что это не очень полный или полезный ответ. Сказать «Google it» означает отсутствие усилий, особенно если учесть, что подавляющее большинство людей попадают сюда из поиска Google. Я думаю, что минимум, что вы могли бы сделать, это добавить ссылки на официальную документацию. TBH, единственная причина, по которой я не пометил его для удаления, заключался в том, что это хотя бы частичный ответ на вопрос. Я знаю, что он старый, но, пожалуйста, рассмотрите возможность его редактирования, чтобы предоставить более подробную информацию.
Шон Боб
15

Чтобы помочь понять, что делать $#, $0и $1, ..., $nделаю, я использую этот скрипт:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Запуск его возвращает репрезентативный вывод:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine
Федорки "ТАК прекратить вредить"
источник
4
Что означает! Я имею в виду в вашем цикле? Вот почему я здесь, и я нигде не могу найти ответ, потому что не знаю, как это назвать.
Энтони
7
@ Энтони это называется переменным косвенным обращением . Вы можете найти хорошее объяснение его использования в bash: косвенное расширение, пожалуйста, объясните? ,
Федорки "ТАК прекратить причинять вред"
3

Позаботьтесь о некоторых примерах; $ 0 может включать в себя начальный путь, а также название программы. Например, сохраните этот двухстрочный скрипт как ./mytry.sh и выполните его.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Вывод:

parameter 0 --> ./mytry.sh

Это на текущей (2016 год) версии Bash, через Slackware 14.2

Адриан Коул
источник
5
То, содержит ли $ 0 путь или нет, зависит от того, как вы запустили скрипт. Если вы выполнили «./mytry.sh», это то, что вы увидите в $ 0. Если вы ввели «~ / mytry.sh», вы увидите полный путь (потому что оболочка будет расширена ~). Если вы сделали «. Mytry.sh», вы увидите «bash».
Стив Фолли,