Bash
Zmienne wewnętrzne
Szukaj…
Wprowadzenie
Rzuć okiem na zmienne wewnętrzne
Zmienna | Detale |
---|---|
$* / $@ | Parametry pozycyjne funkcji / skryptu (argumenty). Rozwiń w następujący sposób: $* i $@ są takie same jak $1 $2 ... (pamiętaj, że nie ma sensu pozostawiać tych bez cudzysłowu) "$*" to to samo co "$1 $2 ..." 1 "$@" to to samo, co "$1" "$2" ... 1. Argumenty są oddzielone pierwszym znakiem $ IFS, który nie musi być spacją. |
$# | Liczba parametrów pozycyjnych przekazanych do skryptu lub funkcji |
$! | Identyfikator procesu ostatniej komendy (najbardziej odpowiednia dla potoków) w najnowszym zadaniu umieszczonym w tle (zwróć uwagę, że niekoniecznie jest taki sam jak identyfikator grupy procesów zadania, gdy kontrola zadań jest włączona) |
$$ | Identyfikator procesu, który wykonał bash |
$? | Wyjdź ze statusu ostatniego polecenia |
$n | Parametry pozycyjne, gdzie n = 1, 2, 3, ..., 9 |
${n} | Parametry pozycyjne (takie same jak powyżej), ale n może wynosić> 9 |
$0 | W skryptach ścieżka, z którą skrypt został wywołany; z bash -c 'printf "%s\n" "$0"' name args' : name (pierwszy argument po skrypcie wbudowanym), w przeciwnym razie argv[0] który otrzymał bash . |
$_ | Ostatnie pole ostatniego polecenia |
$IFS | Separator pola wewnętrznego |
$PATH | Zmienna środowiskowa PATH używana do wyszukiwania plików wykonywalnych |
$OLDPWD | Poprzedni katalog roboczy |
$PWD | Aktualny katalog roboczy |
$FUNCNAME | Tablica nazw funkcji na stosie wywołań wykonawczych |
$BASH_SOURCE | Tablica zawierająca ścieżki źródłowe elementów w tablicy FUNCNAME . Można go użyć do uzyskania ścieżki skryptu. |
$BASH_ALIASES | Tablica asocjacyjna zawierająca wszystkie aktualnie zdefiniowane aliasy |
$BASH_REMATCH | Tablica dopasowań z ostatniego dopasowania wyrażenia regularnego |
$BASH_VERSION | Ciąg wersji Bash |
$BASH_VERSINFO | Tablica 6 elementów z informacjami o wersji Bash |
$BASH | Bezwzględna ścieżka do aktualnie wykonywanej powłoki Bash (określona heurystycznie przez bash na podstawie argv[0] i wartości $PATH ; może być niepoprawna w przypadkach narożnych) |
$BASH_SUBSHELL | Poziom podpowłoki Bash |
$UID | Rzeczywisty (nieskuteczny, jeśli inny) ID użytkownika dla procesu uruchamiającego bash |
$PS1 | Podstawowy wiersz poleceń; zobacz Używanie zmiennych PS * |
$PS2 | Drugi wiersz polecenia (używany do wprowadzania dodatkowych danych) |
$PS3 | Wiersz trzeciorzędnego wiersza polecenia (używany w pętli wyboru) |
$PS4 | Czwarty wiersz polecenia (służy do dołączania informacji z pełnymi danymi wyjściowymi) |
$RANDOM | Pseudolosowa liczba całkowita od 0 do 32767 |
$REPLY | Zmienna używana domyślnie do read , gdy nie określono żadnej zmiennej. Używany również przez select do zwracania wartości podanej przez użytkownika |
$PIPESTATUS | Zmienna tablicowa, która przechowuje wartości statusu wyjścia każdego polecenia w ostatnio wykonywanym potoku pierwszego planu. |
Przypisanie zmiennej nie może zawierać spacji przed i po.
a=123
niea = 123
. Ten ostatni (znak równości otoczony spacjami) w izolacji oznacza uruchomienie poleceniaa
z argumentami=
i123
, chociaż widać to również w operatorze porównywania ciągów (który syntaktycznie jest argumentem dla[
lub[[
lub innego testu, którym jesteś za pomocą).
$ BASHPID
Identyfikator procesu (pid) bieżącej instancji Bash. Nie jest to to samo, co zmienna $$
, ale często daje ten sam wynik. Jest to nowość w Bash 4 i nie działa w Bash 3.
~> $ echo "\$\$ pid = $$ BASHPID = $BASHPID"
$$ pid = 9265 BASHPID = 9265
$ BASH_ENV
Zmienna środowiskowa wskazująca plik startowy Bash, który jest odczytywany po wywołaniu skryptu.
$ BASH_VERSINFO
Tablica zawierająca pełne informacje o wersji podzielona na elementy, o wiele wygodniejsza niż $BASH_VERSION
jeśli szukasz głównej wersji:
~> $ for ((i=0; i<=5; i++)); do echo "BASH_VERSINFO[$i] = ${BASH_VERSINFO[$i]}"; done
BASH_VERSINFO[0] = 3
BASH_VERSINFO[1] = 2
BASH_VERSINFO[2] = 25
BASH_VERSINFO[3] = 1
BASH_VERSINFO[4] = release
BASH_VERSINFO[5] = x86_64-redhat-linux-gnu
$ BASH_VERSION
Pokazuje działającą wersję bash, pozwala to zdecydować, czy można użyć zaawansowanych funkcji:
~> $ echo $BASH_VERSION
4.1.2(1)-release
EDYTOR $
Domyślny edytor, w którym zostaną uruchomione dowolne skrypty lub programy, zwykle vi lub emacs.
~> $ echo $EDITOR
vi
$ FUNCNAME
Aby uzyskać nazwę bieżącej funkcji - wpisz:
my_function()
{
echo "This function is $FUNCNAME" # This will output "This function is my_function"
}
Ta instrukcja nic nie zwróci, jeśli wpiszesz ją poza funkcją:
my_function
echo "This function is $FUNCNAME" # This will output "This function is"
$ HOME
Katalog domowy użytkownika
~> $ echo $HOME
/home/user
$ HOSTNAME
Nazwa hosta przypisana do systemu podczas uruchamiania.
~> $ echo $HOSTNAME
mybox.mydomain.com
$ HOSTTYPE
Ta zmienna identyfikuje sprzęt, może być przydatna przy określaniu, które pliki binarne mają zostać wykonane:
~> $ echo $HOSTTYPE
x86_64
GRUPY $
Tablica zawierająca liczby grup, w których znajduje się użytkownik:
#!/usr/bin/env bash
echo You are assigned to the following groups:
for group in ${GROUPS[@]}; do
IFS=: read -r name dummy number members < <(getent group $group )
printf "name: %-10s number: %-15s members: %s\n" "$name" "$number" "$members"
done
$ IFS
Zawiera ciąg separatora pól wewnętrznych, którego bash używa do dzielenia ciągów podczas zapętlania itp. Domyślne znaki to białe znaki: \n
(nowa linia), \t
(tab) i spacja. Zmiana tego na coś innego pozwala podzielić ciągi znaków za pomocą różnych znaków:
IFS=","
INPUTSTR="a,b,c,d"
for field in ${INPUTSTR}; do
echo $field
done
Wynikiem powyższego jest:
a
b
c
d
Uwagi:
- Jest to odpowiedzialne za zjawisko znane jako dzielenie słów .
$ LINENO
Zwraca numer wiersza w bieżącym skrypcie. Głównie przydatny podczas debugowania skryptów.
#!/bin/bash
# this is line 2
echo something # this is line 3
echo $LINENO # Will output 4
$ MACHTYPE
Podobnie jak powyżej $HOSTTYPE
, obejmuje to również informacje o systemie operacyjnym i sprzęcie
~> $ echo $MACHTYPE
x86_64-redhat-linux-gnu
$ OLDPWD
OLDPWD ( OLDP rint W orking D irectory) zawiera katalog przed ostatnim poleceniem cd
:
~> $ cd directory
directory> $ echo $OLDPWD
/home/user
$ OSTYPE
Zwraca informacje o typie systemu operacyjnego uruchomionego na komputerze, np.
~> $ echo $OSTYPE
linux-gnu
ŚCIEŻKA $
Ścieżka wyszukiwania umożliwiająca znalezienie plików binarnych dla poleceń. Typowe przykłady to /usr/bin
i /usr/local/bin
.
Gdy użytkownik lub skrypt próbuje uruchomić polecenie, przeszukiwane są ścieżki w $PATH
w celu znalezienia pasującego pliku z uprawnieniem do wykonywania.
Katalogi w $PATH
oddzielone są :
charakter.
~> $ echo "$PATH"
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
Na przykład, biorąc pod uwagę powyższą lss
$PATH
, jeśli wpiszesz lss
w wierszu poleceń, powłoka wyszuka /usr/kerberos/bin/lss
, następnie /usr/local/bin/lss
, następnie /bin/lss
, a następnie /usr/bin/lss
, w tej kolejności, zanim dojdzie do wniosku, że nie ma takiego polecenia.
$ PPID
Identyfikator procesu (pid) skryptu lub rodzica powłoki, co oznacza proces niż wywołanie bieżącego skryptu lub powłoki.
~> $ echo $$
13016
~> $ echo $PPID
13015
$ PWD
PWD ( P rint W orking D irectory) Bieżący katalog roboczy, w którym aktualnie się znajdujesz:
~> $ echo $PWD
/home/user
~> $ cd directory
directory> $ echo $PWD
/home/user/directory
$ SEKUND
Liczba sekund działania skryptu. Może to być dość duże, jeśli zostanie pokazane w powłoce:
~> $ echo $SECONDS
98834
SHELLOPTS
Przy uruchamianiu dostarczana jest tylko do odczytu lista opcji bash, aby kontrolować jej zachowanie:
~> $ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
$ SHLVL
Po wykonaniu polecenia bash otwierana jest nowa powłoka. Zmienna środowiskowa $ SHLVL zawiera liczbę poziomów powłoki, na których działa bieżąca powłoka.
W nowym oknie terminala wykonanie następującego polecenia spowoduje uzyskanie różnych wyników w zależności od używanej dystrybucji systemu Linux.
echo $SHLVL
W Fedorze 25 wynikiem jest „3”. Wskazuje to, że podczas otwierania nowej powłoki wykonuje się początkowe polecenie bash i wykonuje zadanie. Początkowe polecenie bash wykonuje proces potomny (inne polecenie bash), które z kolei wykonuje ostatnie polecenie bash w celu otwarcia nowej powłoki. Gdy nowa powłoka zostanie otwarta, działa jako proces potomny 2 innych procesów powłoki, stąd wynik „3”.
W poniższym przykładzie (biorąc pod uwagę, że użytkownik korzysta z Fedory 25), wyjście $ SHLVL w nowej powłoce zostanie ustawione na „3”. Gdy każde polecenie bash jest wykonywane, $ SHLVL zwiększa się o jeden.
~> $ echo $SHLVL
3
~> $ bash
~> $ echo $SHLVL
4
~> $ bash
~> $ echo $SHLVL
5
Widać, że wykonanie polecenia „bash” (lub wykonanie skryptu bash) otwiera nową powłokę. Dla porównania, wyszukiwanie skryptu uruchamia kod w bieżącej powłoce.
test1.sh
#!/usr/bin/env bash
echo "Hello from test1.sh. My shell level is $SHLVL"
source "test2.sh"
test2.sh
#!/usr/bin/env bash
echo "Hello from test2.sh. My shell level is $SHLVL"
run.sh
#!/usr/bin/env bash
echo "Hello from run.sh. My shell level is $SHLVL"
./test1.sh
Wykonać:
chmod +x test1.sh && chmod +x run.sh
./run.sh
Wynik:
Hello from run.sh. My shell level is 4
Hello from test1.sh. My shell level is 5
Hello from test2.sh. My shell level is 5
$ UID
Zmienna tylko do odczytu, która przechowuje numer identyfikacyjny użytkownika:
~> $ echo $UID
12345
1 USD 2 USD 3 USD itp ...
Parametry pozycyjne przekazywane do skryptu z wiersza polecenia lub funkcji:
#!/bin/bash
# $n is the n'th positional parameter
echo "$1"
echo "$2"
echo "$3"
Wynikiem powyższego jest:
~> $ ./testscript.sh firstarg secondarg thirdarg
firstarg
secondarg
thirdarg
Jeśli liczba argumentów pozycyjnych jest większa niż dziewięć, należy użyć nawiasów klamrowych.
# "set -- " sets positional parameters
set -- 1 2 3 4 5 6 7 8 nine ten eleven twelve
# the following line will output 10 not 1 as the value of $1 the digit 1
# will be concatenated with the following 0
echo $10 # outputs 1
echo ${10} # outputs ten
# to show this clearly:
set -- arg{1..12}
echo $10
echo ${10}
$ #
Aby uzyskać liczbę argumentów wiersza poleceń lub parametrów pozycyjnych - wpisz:
#!/bin/bash
echo "$#"
Po uruchomieniu z trzema argumentami powyższy przykład da wynik:
~> $ ./testscript.sh firstarg secondarg thirdarg
3
$ *
Zwróci wszystkie parametry pozycyjne w jednym ciągu.
testcript.sh:
#!/bin/bash
echo "$*"
Uruchom skrypt z kilkoma argumentami:
./testscript.sh firstarg secondarg thirdarg
Wynik:
firstarg secondarg thirdarg
$!
Identyfikator procesu (pid) ostatniego zadania uruchomionego w tle:
~> $ ls &
testfile1 testfile2
[1]+ Done ls
~> $ echo $!
21715
_ _
Zwraca ostatnie pole z ostatniego wykonanego polecenia, przydatne do przekazania czegoś do następnego polecenia:
~> $ ls *.sh;echo $_
testscript1.sh testscript2.sh
testscript2.sh
Podaje ścieżkę skryptu, jeśli jest używana przed innymi poleceniami:
test.sh:
#!/bin/bash
echo "$_"
Wynik:
~> $ ./test.sh # running test.sh
./test.sh
Uwaga: To nie jest niezawodny sposób na uzyskanie ścieżki skryptu
$?
Status wyjścia ostatnio wykonanej funkcji lub polecenia. Zwykle 0 oznacza OK, wszystko inne wskazuje na awarię:
~> $ ls *.blah;echo $?
ls: cannot access *.blah: No such file or directory
2
~> $ ls;echo $?
testfile1 testfile2
0
$$
Identyfikator procesu (pid) bieżącego procesu:
~> $ echo $$
13246
$ @
"$@"
rozwija się do wszystkich argumentów wiersza poleceń jako osobnych słów. Różni się od "$*"
, który rozwija się do wszystkich argumentów jako pojedyncze słowo.
"$@"
Jest szczególnie przydatna dla zapętlenie poprzez argumenty i obsługi argumentów ze spacjami.
Rozważmy, że jesteśmy w skrypcie, który wywołaliśmy z dwoma argumentami, takimi jak:
$ ./script.sh "␣1␣2␣" "␣3␣␣4␣"
Zmienne $*
lub $@
zostaną rozwinięte do $1␣$2
, które z kolei rozwiną się do 1␣2␣3␣4
więc pętla poniżej:
for var in $*; do # same for var in $@; do
echo \<"$var"\>
done
wydrukuje dla obu
<1>
<2>
<3>
<4>
Podczas gdy "$*"
zostanie rozwinięte do "$1␣$2"
które z kolei rozwiną się w "␣1␣2␣␣␣3␣␣4␣"
a zatem pętla:
for var in "$*"; do
echo \<"$var"\>
done
wywoła echo
tylko raz i wydrukuje
<␣1␣2␣␣␣3␣␣4␣>
I w końcu "$@"
rozwinie się w "$1" "$2"
, które rozwinie się w "␣1␣2␣" "␣3␣␣4␣"
a więc pętla
for var in "$@"; do
echo \<"$var"\>
done
wydrukuje
<␣1␣2␣>
<␣3␣␣4␣>
tym samym zachowując zarówno wewnętrzne odstępy w argumentach, jak i separację argumentów. Zauważ, że konstrukcja for var in "$@"; do ...
jest tak powszechne i idiomatyczne, że jest domyślną opcją dla pętli for i można ją skrócić do for var; do ...
$ HISTSIZE
Maksymalna liczba zapamiętanych poleceń:
~> $ echo $HISTSIZE
1000
LOSOWO
Za każdym razem, gdy odwołuje się do tego parametru, generowana jest losowa liczba całkowita od 0 do 32767. Przypisanie wartości tej zmiennej powoduje wygenerowanie generatora liczb losowych ( źródła ).
~> $ echo $RANDOM
27119
~> $ echo $RANDOM
1349