Які спеціальні змінні оболонки знака долара?


781

У Bash, здається, є кілька змінних, які містять спеціальні, послідовно значущі значення. Наприклад,

./myprogram &; echo $!

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


15
Кілька з них - не лише Баш. Вони також використовуються в інших снарядів, пов'язаних з Борном, і фактично визначені POSIX .
Призупинено до подальшого повідомлення.

1
Як щодо: IFS = $ '\ п' Див: stackoverflow.com/questions/4128235 / ...
SGU

1
@sgu Це не параметр; це особливий тип цитування. $'\n'є буквальним символом нового рядка, який є результатом заміни диграфа \nна ASCII 10.
Чепнер,

Якщо ви прийшли сюди в пошуках ${1}, ${*}і т.д., дужка тільки для усунення неоднозначності, і часто надлишкова. У самоті, ${x}рівнозначно $x.
tripleee

Що $!означає? Я знаю, !$але не це.
Шрідхар Сарнобат

Відповіді:


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

Більшість із зазначеного вище можна знайти у розділі Спеціальні параметри у Довідковому посібнику Bash. Є всі змінні середовища, встановлені оболонкою .

Для вичерпного індексу, див. Довідник Інструкція змінної індексу .


2
Усі вони задокументовані на bashсторінці людини. Єдиний дивний факт, $_який згадується лише в контексті його використання в MAILPATHзмінній.
чепнер

4
@chepner шукайте в man(1) bashрозділі Спеціальні параметри для решти означення $_.
kojiro

8
Я використовую !$замість $_скриптів bash, тому що останній часом виходить з ладу.
amc

Хороший список, який. Я наткнувся на цей синтаксис $ {1 + "$ @"} що це означає?
користувач178047

3
@amc: Див. unix.stackexchange.com/questions/271659/… щодо відмінностей між !$та $_.
tricasse

44
  • $_ останній аргумент останньої команди
  • $# кількість аргументів, переданих поточному сценарію
  • $*/ $@список аргументів, переданих до сценарію у вигляді рядка / розмежуваного списку

з верхньої частини голови. Google for bash спеціальні змінні.


124
"Я це зробив. Вони відправили мене сюди". - Skit Bookshop (офіційний doc: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo

1
Я думаю, що $@це рядок і $*є розмежованим списком (відповідно до вище прийнятої відповіді, у будь-якому випадку).
RastaJedi

1
@RastaJedi: "$@"розширюється до списку, "$*"розширюється на одну рядок. Особлива поведінка $@застосовується, коли вона знаходиться в подвійних лапках.
Кіт Томпсон

6
Незважаючи на те, що це не дуже повна або корисна відповідь. Сказати "Google це" свідчить про нестачу зусиль, особливо зважаючи на те, що переважна більшість людей закінчуються тут пошуком Google. Я думаю, що найменше ви можете зробити додавання посилань на офіційну документацію. ТББ, єдиною причиною я не позначив це для видалення через те, що це хоча б часткова відповідь на питання. Я знаю, що він старий, але, будь ласка, подумайте про його редагування, щоб отримати детальнішу інформацію.
Шон Бін

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
@Anthony це називається змінною непрямістю . Ви можете знайти добре пояснення його використання в bash: непряме розширення, будь ласка, поясніть? .
fedorqui 'ТАК перестаньте шкодити'

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", ви побачите "баш".
Стів Фоллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.