Geneste vervanging van variabelen en vooraf gedefinieerde BASH-variabelen in Linux - Deel 11
De laatste twee artikelen over BASH Shell, waarin we variabelen in detail bespraken, werden zeer gewaardeerd door onze lezers. Wij als Tecmint-Team willen u graag voorzien van de nieuwste, actuele en relevante onderwerpen die gedetailleerd worden behandeld. Bovendien proberen we altijd de belangrijkste perspectieven van de betreffende onderwerpen aan te raken.
Hier is het laatste artikel over Linux-variabelen, waarin we de vervanging van variabelen en variabelen die in Shell worden gedefinieerd gaan zien voordat we dit onderwerp sluiten.
Bash voert variabelenvervanging uit voordat het commando daadwerkelijk wordt uitgevoerd. De Linux Bash Shell zoekt naar alle ‘$’-tekens voordat de opdracht wordt uitgevoerd en vervangt deze door de waarde van variabele. Het proces van Bash-variabelevervanging wordt slechts één keer uitgevoerd. Wat als we geneste variabelen hebben?
Opmerking: met geneste variabele bedoelen we de variabele die binnen de variabele is gedeclareerd. Laten we het bovenstaande scenario in het onderstaande voorbeeld bekijken.
Declareer een variabele die alleen-lezen en uitvoerbaar is, zoals hieronder.
avi@localhost:~$ declare -rx Linux_best_website="linux-console.net"
Controleer de waarde van de opgeslagen variabele.
avi@localhost:~$ printf "%s" "$Linux_best_website"
linux-console.net
Declareer nu een andere variabele die opnieuw alleen-lezen en uitvoerbaar is.
avi@localhost:~$ declare -rx Linux_website="Linux_best_website"
De situatie is nu: we hebben twee variabelen gedefinieerd.
‘Linux_best_website’, waarvan de waarde “linux-console.net” is
en ‘Linux_website’, waarvan de waarde ‘Linux_best_website’ is
Wat zou het resultaat zijn als we de onderstaande opdracht van één regel uitvoeren?
avi@localhost:~$ printf "%s" "$Linux_website"
Het zou eerst de variabele '$Linux_website' moeten vervangen door de waarde “Linux_best_website ” en dan is “$Linux_best_website ” opnieuw een variabele met de waarde van dat is “linux-console.net”. Dus de uiteindelijke uitvoer van het uitvoeren van de onderstaande opdracht zou moeten zijn.
avi@localhost:~$ printf "%s" "$Linux_website"
linux-console.net
Maar helaas is dit niet de situatie; de uitvoer die we krijgen is Linux_best_website.
Reden? JEP! Bash vervangt de waarde van de variabele slechts één keer. Hoe zit het met complexe scripts en programma's waarbij we variabelen regelmatig moeten vervangen en de variabele ook meer dan eens moeten vervangen?
Hier komt het commando ‘eval‘ dat extra werk van variabele vervanging meer dan eens in een script uitvoert. Hier is een voorbeeld om de hele werking glashelder te maken.
Declareer een variabele x, waarvan de waarde 10 is.
avi@localhost:~/Desktop$ declare x=10
Controleer de waarde van variabele x, die we zojuist hebben gedefinieerd.
avi@localhost:~/Desktop$ echo $yx
x10
Declareer een variabele y, waarvan de waarde x is.
avi@localhost:~/Desktop$ declare y=x
Controleer de waarde van variabele y, die we zojuist hebben gedefinieerd.
avi@localhost:~/Desktop$ echo $y
x
Hier is het probleem van BASH eenmalige vervanging van variabelen, waarbij geen extra ronde van vervanging van variabelen wordt uitgevoerd. We gebruiken de opdracht ‘eval’ om dit op te lossen.
avi@localhost:~/Desktop$ eval y=$x
Controleer nu de waarde van variabele ‘y‘.
avi@localhost:~/Desktop$ echo $y
10
Hoera! Het probleem is opgelost en het commando ‘eval’ heeft de race gewonnen :)
Om nog maar te zwijgen van het feit dat de opdracht ‘eval’ erg handig is in grote scriptprogramma’s en een erg handig hulpmiddel is.
Het laatste maar niet het minste deel van dit bericht zijn vooraf gedefinieerde BASH-variabelen. Nee! Raak niet in paniek als je deze lijst ziet. U hoeft nooit de hele lijst te onthouden voordat u begint met het schrijven van scripts, op enkele na. Als onderdeel van het leerproces presenteren we de BASH-lijst met vooraf gedefinieerde variabelen.
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 |
Er is een enorme lijst met vooraf gedefinieerde BASH-variabelen. We hebben geprobeerd een lijst samen te stellen van de meest gebruikte.
Dat is het voor nu. Ik ben er weer met een interessant artikel. Blijf tot die tijd op de hoogte en verbonden met TecMint. Vergeet niet om ons uw waardevolle feedback te geven in het commentaargedeelte hieronder.