Zagnieżdżone podstawienie zmiennych i predefiniowane zmienne BASH w systemie Linux — część 11
Ostatnie dwa artykuły na temat powłoki BASH, w których szczegółowo omówiliśmy zmienne, spotkały się z dużym uznaniem wśród naszych czytelników. Jako Tecmint-Team bardzo pragniemy zapewnić Państwu najnowsze, aktualne i istotne tematy omówione szczegółowo. Co więcej, zawsze staramy się poruszyć główne perspektywy odpowiednich tematów.
Oto ostatni artykuł na temat zmiennych w systemie Linux, w którym przed zamknięciem tego tematu zobaczymy podstawienia zmiennych i zmienne zdefiniowane w powłoce.
Bash dokonuje podstawienia zmiennych przed faktycznym wykonaniem polecenia. Linux Bash Shell wyszukuje cały znak „$” przed wykonaniem polecenia i zastępuje go wartością zmiennej. Proces podstawienia zmiennej Bash jest wykonywany tylko raz. A co jeśli mamy zagnieżdżone zmienne?
Uwaga: Przez zmienną zagnieżdżoną mamy na myśli zmienną zadeklarowaną wewnątrz zmiennej. Zobaczmy powyższy scenariusz w poniższym przykładzie.
Zadeklaruj zmienną, która jest tylko do odczytu i wykonywalna, jak poniżej.
avi@localhost:~$ declare -rx Linux_best_website="linux-console.net"
Sprawdź wartość zapisanej zmiennej.
avi@localhost:~$ printf "%s" "$Linux_best_website"
linux-console.net
Teraz zadeklaruj kolejną zmienną, która ponownie jest tylko do odczytu i wykonywalna.
avi@localhost:~$ declare -rx Linux_website="Linux_best_website"
Sytuacja jest taka, że zdefiniowaliśmy dwie zmienne.
„Linux_best_website”, której wartość to „linux-console.net”
oraz „Linux_website”, której wartość to „Linux_best_website”
Jaki byłby wynik, jeśli uruchomilibyśmy poniższe jednowierszowe polecenie?
avi@localhost:~$ printf "%s" "$Linux_website"
Należy najpierw zastąpić zmienną „$Linux_website” wartością „Linux_best_web> ”, a następnie „$Linux_best_website” jest ponownie zmienną o wartości czyli „linux-console.net”. Zatem końcowy wynik uruchomienia poniższego polecenia powinien być.
avi@localhost:~$ printf "%s" "$Linux_website"
linux-console.net
Ale niestety tak nie jest, wynik, który otrzymujemy, to Linux_best_website.
Powód? Tak! Bash podstawia wartość zmiennej tylko raz. A co ze złożonymi skryptami i programami, w których musimy często podstawiać zmienne, a także wielokrotnie podstawiać zmienne?
Oto polecenie „eval”, które wykonuje w skrypcie dodatkową pracę polegającą na podstawieniu zmiennych więcej niż raz. Oto przykład, aby całość była przejrzysta jak szkło.
Zadeklaruj zmienną x, której wartość wynosi 10.
avi@localhost:~/Desktop$ declare x=10
Sprawdź wartość zmiennej x, którą właśnie zdefiniowaliśmy.
avi@localhost:~/Desktop$ echo $yx
x10
Zadeklaruj zmienną y, której wartość wynosi x.
avi@localhost:~/Desktop$ declare y=x
Sprawdź wartość zmiennej y, którą właśnie zdefiniowaliśmy.
avi@localhost:~/Desktop$ echo $y
x
Oto problem jednorazowego podstawienia zmiennej BASH, który nie powoduje dodatkowej rundy podstawienia zmiennych. Aby to naprawić, używamy polecenia „eval”.
avi@localhost:~/Desktop$ eval y=$x
Teraz sprawdź wartość zmiennej „y”.
avi@localhost:~/Desktop$ echo $y
10
Hurra! Problem został rozwiązany, a polecenie „eval” wygrało wyścig :)
Nie wspominając już o tym, że polecenie „eval” jest bardzo pomocne w dużych programach skryptowych i jest bardzo przydatnym narzędziem.
Ostatnią, ale nie najmniej ważną częścią tego posta są predefiniowane zmienne BASH. NIE! Nie wpadaj w panikę, widząc tę listę. Nigdy nie musisz pamiętać całej listy przed rozpoczęciem pisania skryptów, z wyjątkiem kilku. W ramach procesu uczenia się prezentujemy predefiniowaną Listę zmiennych BASH.
No. | BASH VARIABLE | RESULT |
1 | auto_resume | Process command completion for the stopped jobs. |
2 | BASH | PATH of the shell. |
3 | BASH_ENV | Shows the name of the profile file |
4 | BASH_VERSION | Shows the version of Bash |
5 | BASH_VERSINFO | Shows Detailed version information. |
6 | BASH_VERSINFO[0] | The major version number (the release). |
7 | BASH_VERSINFO[1] | The minor version number (the version). |
8 | BASH_VERSINFO[2] | The patch level. |
9 | BASH_VERSINFO[3] | The build version. |
10 | BASH_VERSINFO[4] | The release status (for example, beta1 ). |
11 | BASH_VERSINFO[5] | The value of MACHTYPE . |
12 | CDPATH | List of directories separated by colon. |
13 | COLUMNS | Number of Characters per line on Standard Output. |
14 | EUID | User ID of the current user. |
15 | FCEDIT | The default text editor for the fc command. |
16 | FUNCNAME | The name of the fun |
17 | GROUPS | Groups of which the user is a Member. |
18 | HISTFILE | The file containing the command history. |
19 | HOME | The name of your home directory. |
20 | LINES | Number of horizontal lines on Standard Output. |
21 | Name of a file to check for incoming mail | |
22 | OSTYPE | Name of the operating system. |
23 | OLDPWD | The previous working directory |
24 | PWD | The current working directory |
25 | RANDOM | Prints a random number |
26 | SHELL | The preferred shell to use |
27 | TIMEFORMAT | The format for the time command. |
28 | UID | The ID of the current user |
Istnieje ogromna lista predefiniowanych zmiennych BASH. Staraliśmy się stworzyć listę najczęściej używanych.
To wszystko na teraz. Wrócę tu ponownie z kolejnym ciekawym artykułem. Do tego czasu bądź na bieżąco i połącz się z TecMint. Nie zapomnij podzielić się z nami swoją cenną opinią w sekcji komentarzy poniżej.