Szukaj…


Wprowadzenie

Przegląd wewnętrznych zmiennych Bash, gdzie, jak i kiedy ich używać.

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 nie a = 123 . Ten ostatni (znak równości otoczony spacjami) w izolacji oznacza uruchomienie polecenia a z argumentami = i 123 , 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:

$ 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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow