Jakie są specjalne zmienne powłoki znaku dolara?

781

W Bash wydaje się, że istnieje kilka zmiennych, które posiadają specjalne, konsekwentnie znaczące wartości. Na przykład,

./myprogram &; echo $!

zwróci PID procesu, który był w tle myprogram. Znam inne, na przykład takie, $?które według mnie są obecnym TTY. Czy są jeszcze inni?

Z Douglas
źródło
15
Kilka z nich to nie tylko Bash. Są one również używane w innych powłokach związanych z Bourne'em i tak naprawdę są określone przez POSIX .
Wstrzymano do odwołania.
1
Co z: IFS = $ '\ n' Patrz: stackoverflow.com/questions/4128235/...
sgu
1
@sgu To nie jest parametr; to specjalny rodzaj cytowania. $'\n'jest dosłownie znakiem nowej linii, który powstaje w wyniku zastąpienia digraftu \nprzez ASCII 10.
chepner
Jeśli przyszedł tu szukasz ${1}, ${*}itp, szelki są tylko dla dezambiguacji, często zbędne. W izolacji ${x}jest dokładnie równoważne z $x.
tripleee
Co $!znaczy Jestem tego świadomy, !$ale nie taki.
Sridhar Sarnobat

Odpowiedzi:

1357
  • $1, $2, $3, ... są parametry pozycyjne .
  • "$@"Jest to konstrukcja tablicowej wszystkich parametrów pozycyjnych {$1, $2, $3 ...}.
  • "$*"jest rozszerzenie IFS wszystkich parametrów pozycyjnych $1 $2 $3 ....
  • $# to liczba parametrów pozycyjnych.
  • $- bieżące opcje ustawione dla powłoki.
  • $$ pid bieżącej powłoki (nie podpowłoki).
  • $_ najnowszy parametr (lub ścieżka abs polecenia, aby uruchomić bieżącą powłokę natychmiast po uruchomieniu).
  • $IFS jest separatorem pól (wejściowych).
  • $? to najnowszy status wyjścia z rurociągu pierwszego planu.
  • $! jest PID najnowszego polecenia w tle.
  • $0 to nazwa powłoki lub skryptu powłoki.

Większość powyższych można znaleźć w sekcji Parametry specjalne w podręczniku Bash Reference. Istnieją wszystkie zmienne środowiskowe ustawione przez powłokę .

Aby zapoznać się z pełnym indeksem, zobacz Indeks zmiennych .

kojiro
źródło
2
Wszystkie są udokumentowane na bashstronie man. Jedyną osobliwością jest to, że $_jest wspomniane tylko w kontekście jej użycia w MAILPATHzmiennej.
chepner
4
@chepner zajrzyj do man(1) bashsekcji Parametry specjalne, aby zobaczyć resztę definicji $_.
kojiro
8
Używam !$zamiast $_w skryptach bash, ponieważ te ostatnie czasami zawodzą.
amc
Ładna lista kojiro. Natrafiłem na tę składnię $ {1 + "$ @"} co to znaczy?
user178047,
3
@amc: Zobacz unix.stackexchange.com/questions/271659/…, aby zobaczyć różnice między !$i $_.
tricasse
44
  • $_ ostatni argument ostatniego polecenia
  • $# liczba argumentów przekazanych do bieżącego skryptu
  • $*/ $@lista argumentów przekazanych do skryptu jako lista ciąg / lista rozdzielana

z czubka mojej głowy. Google dla zmiennych specjalnych bash.

Dan
źródło
124
„Tak. Wysłali mnie tutaj”. - Skecz z księgarni (oficjalny dokument: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo
1
Myślę, że $@jest to ciąg znaków i $*lista rozdzielana (zgodnie z powyższą zaakceptowaną odpowiedzią, tak czy inaczej).
RastaJedi,
1
@RastaJedi: "$@"rozwija się do listy, "$*"rozwija się do pojedynczego ciągu. Specjalne zachowanie $@ma zastosowanie, gdy występuje w podwójnych cudzysłowach.
Keith Thompson,
6
Zagłosowano, ponieważ nie jest to zbyt kompletna ani pomocna odpowiedź. Powiedzenie „Google to” pokazuje brak wysiłku, zwłaszcza biorąc pod uwagę, że zdecydowana większość ludzi kończy tutaj z wyszukiwania Google. Myślę, że możesz przynajmniej dodać linki do oficjalnej dokumentacji. TBH, jedynym powodem, dla którego nie oflagowałem go do usunięcia, było to, że jest to przynajmniej częściowa odpowiedź na pytanie. Wiem, że jest stary, ale proszę rozważyć jego edycję, aby podać więcej szczegółów.
Sean the Bean,
15

Aby pomóc zrozumieć, co nie $#, $0i $1, ..., $nnie używam tego skryptu:

#!/bin/bash

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

Uruchomienie zwraca reprezentatywne wyjście:

$ ./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
fedorqui „SO przestań szkodzić”
źródło
4
Co masz na myśli! W twojej pętli for? Właśnie dlatego tu jestem i nigdzie nie mogę znaleźć odpowiedzi, ponieważ nie wiem, jak to nazwać.
Anthony
7
@Anthony nazywa się to zmienną pośrednią . Dobre objaśnienie jego użycia można znaleźć w bash: ekspansja pośrednia, proszę wyjaśnić? .
fedorqui „SO przestań krzywdzić”
3

Przestrzegaj niektórych przykładów; $ 0 może zawierać ścieżkę wiodącą, a także nazwę programu. Np. Zapisz ten dwuliniowy skrypt jako ./mytry.sh i uruchom go.

#!/bin/bash

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

Wynik:

parameter 0 --> ./mytry.sh

Jest to aktualna wersja Bash (rok 2016), za pośrednictwem Slackware 14.2

Adrian Cole
źródło
5
To, czy $ 0 zawiera ścieżkę, zależy od tego, w jaki sposób uruchomiłeś skrypt. Jeśli wykonałeś „./mytry.sh”, zobaczysz to za 0 USD. Jeśli wpiszesz „~ / mytry.sh”, zobaczysz pełną ścieżkę (ponieważ powłoka ulegnie rozszerzeniu ~). Jeśli zrobiłeś „.mytry.sh” zobaczysz „bash”.
Steve Folly