Werken met variabelen in Bash

Een Linux-terminal met groene tekst op een laptop.
Fatmawati Achmad Zaenuri / Shutterstock

Variabelen zijn essentieel als u scripts wilt schrijven en wilt begrijpen wat de code die u gaat knippen en plakken van internet, zal doen met uw Linux-computer. We helpen je op weg!

Variabelen 101

Variabelen zijn benoemde symbolen die een tekenreeks of numerieke waarde vertegenwoordigen. Wanneer u ze in opdrachten en uitdrukkingen gebruikt, worden ze behandeld alsof u de waarde die ze bevatten had getypt in plaats van de naam van de variabele.

Om een ​​variabele te maken, geeft u er gewoon een naam en waarde voor op. Uw variabelenamen moeten beschrijvend zijn en u herinneren aan de waarde die ze bevatten. Een variabelenaam mag niet beginnen met een getal en mag ook geen spaties bevatten. Het kan echter beginnen met een onderstrepingsteken. Afgezien daarvan kunt u elke combinatie van alfanumerieke tekens in hoofdletters en kleine letters gebruiken.

Voorbeelden

Hier maken we vijf variabelen. Het formaat is om de naam te typen, het gelijkteken =, en de waarde. Merk op dat er geen spatie voor of na het gelijkteken is. Een variabele een waarde geven wordt vaak genoemd toewijzen een waarde voor de variabele.

We maken vier stringvariabelen en één numerieke variabele, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

Vijf variabelen in een terminalvenster.

Om de waarde in een variabele te zien, gebruikt u de echo opdracht. U moet de variabelenaam voorafgaan door een dollarteken $ telkens wanneer u verwijst naar de waarde die deze bevat, zoals hieronder weergegeven:

echo $my_name
echo $my_boost
echo $this_year

Het "echo" -commando toont de waarden van variabelen in een terminalvenster.

Laten we al onze variabelen tegelijk gebruiken:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Het "echo" $ my_boost is voor $ mij als $ his_boost voor $ him (c) $ this_year "commando in een terminalvenster.

De waarden van de variabelen vervangen hun namen. U kunt ook de waarden van variabelen wijzigen. Om een ​​nieuwe waarde aan de variabele toe te kennen, my_boost, je herhaalt gewoon wat je deed toen je de eerste waarde toewees, zoals:

my_boost=Tequila

De "my_boost = Tequila" variabele in een terminalvenster.

Als u de vorige opdracht opnieuw uitvoert, krijgt u nu een ander resultaat:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

De echo "$ my_boost is voor $ me als $ his_boost voor $ him (c) $ this_year" commando in een terminalvenster.

U kunt dus dezelfde opdracht gebruiken die naar dezelfde variabelen verwijst en verschillende resultaten krijgen als u de waarden in de variabelen wijzigt.

We zullen later praten over het citeren van variabelen. Hier volgen enkele dingen om te onthouden:

  • Een variabele tussen enkele aanhalingstekens ' wordt behandeld als een letterlijke tekenreeks en niet als een variabele.
  • Variabelen tussen aanhalingstekens " worden behandeld als variabelen.
  • Om de waarde in een variabele te krijgen, moet u het dollarteken opgeven $.
  • Een variabele zonder het dollarteken $ geeft alleen de naam van de variabele.

Juiste en onjuiste voorbeelden van verwijzende variabelen in een terminalvenster.

U kunt ook een variabele maken die zijn waarde ontleent aan een bestaande variabele of een aantal variabelen. Het volgende commando definieert een nieuwe variabele met de naam drink_of_the_Year, en wijst het de gecombineerde waarden van de my_boost en this_year variabelen:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Het drink_of-the_Year = "$ my_boost $ this_year" commando in een terminalvenster.

Variabelen in scripts gebruiken

Scripts zouden volledig verlamd zijn zonder variabelen. Variabelen bieden de flexibiliteit die van een script een algemene in plaats van een specifieke oplossing maakt. Om het verschil te illustreren, is hier een script dat de bestanden in het /dev directory.

Typ dit in een tekstbestand en sla het vervolgens op als fcnt.sh (voor “aantal bestanden”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Voordat u het script kunt uitvoeren, moet u het uitvoerbaar maken, zoals hieronder wordt weergegeven:

chmod +x fcnt.sh

"chmod + x fcnt.sh" in een terminalvenster.

Typ het volgende om het script uit te voeren:

./fcnt.sh

"./fcnt.sh" in een terminalvenster.

Dit drukt het aantal bestanden in het /dev directory. Dit is hoe het werkt:

  • Een variabele genaamd folder_to_count is gedefinieerd, en het is ingesteld om de string “/ dev.”
  • Een andere variabele, genaamd file_count, is gedefinieerd. Deze variabele ontleent zijn waarde aan een opdrachtvervanging. Dit is de opdrachtzin tussen de haakjes $( ). Merk op dat er een dollarteken is $ voor het eerste haakje. Dit construct $( ) evalueert de opdrachten tussen de haakjes en retourneert vervolgens hun uiteindelijke waarde. In dit voorbeeld wordt die waarde toegewezen aan de file_count variabele. Zo ver als de file_count variabele betreft, het heeft een waarde doorgegeven om vast te houden; het maakt zich niet uit hoe de waarde werd verkregen.
  • De opdracht geëvalueerd in de opdrachtvervanging voert een ls bestandslijst in de directory in het folder_to_count variabele, die is ingesteld op “/ dev.” Het script voert dus het commando ‘ls / dev’ uit.
  • De uitvoer van deze opdracht wordt doorgesluisd naar het wc opdracht. De -l (line count) optie oorzaken wc om het aantal regels in de uitvoer van de ls opdracht. Omdat elk bestand op een aparte regel staat, is dit het aantal bestanden en submappen in de map “/ dev”. Deze waarde wordt toegewezen aan de file_count variabele.
  • De laatste regel gebruikt echo om het resultaat uit te voeren.

Maar dit werkt alleen voor de map “/ dev”. Hoe kunnen we het script met elke map laten werken? Het enige dat nodig is, is een kleine verandering.

Commandoregelparameters gebruiken in scripts

Veel opdrachten, zoals ls en wc, neem opdrachtregelparameters. Deze geven informatie aan het commando, zodat het weet wat u wilt dat het doet. Als je wil ls om aan uw homedirectory te werken en ook om verborgen bestanden weer te geven, kunt u de volgende opdracht gebruiken, waarbij de tilde ~ en de -a (alle) opties zijn opdrachtregelparameters:

ls ~ -a

Onze scripts kunnen opdrachtregelparameters accepteren. Er wordt naar verwezen als $1 voor de eerste parameter, $2 als de tweede, enzovoort, tot $9 voor de negende parameter. (Eigenlijk is er een $0, ook, maar dat is gereserveerd om altijd het script vast te houden.)

U kunt in een script naar opdrachtregelparameters verwijzen, net als naar gewone variabelen. Laten we ons script aanpassen, zoals hieronder weergegeven, en het opslaan met de nieuwe naam fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Deze keer is de folder_to_count variabele krijgt de waarde van de eerste opdrachtregelparameter toegewezen, $1.

De rest van het script werkt precies zoals voorheen. In plaats van een specifieke oplossing is uw script nu een algemene. U kunt het in elke map gebruiken omdat het niet hard gecodeerd is om alleen met “/ dev” te werken.

Zo maak je het script uitvoerbaar:

chmod +x fcnt2.sh

"chmod + x fcnt2.sh" in een terminalvenster.

Probeer het nu met een paar mappen. U kunt eerst “/ dev” doen om er zeker van te zijn dat u hetzelfde resultaat krijgt als voorheen. Typ het volgende:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

"./fnct2.sh / dev" in een terminalvenster.

U krijgt hetzelfde resultaat (207 bestanden) als hiervoor voor de map “/ dev”. Dit is bemoedigend en u krijgt mapspecifieke resultaten voor elk van de andere opdrachtregelparameters.

Om het script in te korten, kunt u afzien van de variabele, folder_to_count, helemaal, en alleen verwijzing $1 overal, als volgt:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Werken met speciale variabelen

We noemden $0, die altijd is ingesteld op de bestandsnaam van het script. Hierdoor kunt u het script gebruiken om dingen te doen zoals de naam correct afdrukken, zelfs als de naam is gewijzigd. Dit is handig bij logsituaties, waarin u de naam wilt weten van het proces dat een item heeft toegevoegd.

De volgende zijn de andere speciale vooraf ingestelde variabelen:

  • $ #: Hoeveel opdrachtregelparameters zijn aan het script doorgegeven.
  • $ @: Alle opdrachtregelparameters die aan het script worden doorgegeven.
  • $?: De afsluitstatus van het laatste proces dat is uitgevoerd.
  • $$: De proces-ID (PID) van het huidige script.
  • $ GEBRUIKER: De gebruikersnaam van de gebruiker die het script uitvoert.
  • $ HOSTNAME: De hostnaam van de computer waarop het script wordt uitgevoerd.
  • $ SECONDEN: Het aantal seconden dat het script actief is.
  • $ RANDOM: Retourneert een willekeurig getal.
  • $ LINENO: Retourneert het huidige regelnummer van het script.

Je wilt ze allemaal in één script zien, nietwaar? Jij kan! Sla het volgende op als een tekstbestand met de naam, special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: $@"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Typ het volgende om het uitvoerbaar te maken:

chmod +x special.sh

"chmod + x special.sh" in een terminalvenster.

Nu kunt u het uitvoeren met een aantal verschillende opdrachtregelparameters, zoals hieronder wordt weergegeven.

"./special.sh alpha bravo charlie 56 2048 Thursday" in een terminalvenster.

Omgevingsvariabelen

Bash gebruikt omgevingsvariabelen om de eigenschappen van de omgeving die het creëert bij het opstarten te definiëren en vast te leggen. Deze bevatten informatie waar Bash gemakkelijk toegang toe heeft, zoals uw gebruikersnaam, landinstelling, het aantal opdrachten dat uw geschiedenisbestand kan bevatten, uw standaardeditor en nog veel meer.

Gebruik deze opdracht om de actieve omgevingsvariabelen in uw Bash-sessie te zien:

env | less

Het "env | less" commando in een terminalvenster

Als u door de lijst bladert, vindt u er wellicht enkele die handig zijn om in uw scripts naar te verwijzen.

Een lijst met actieve omgevingsvariabelen in een terminalvenster.

Variabelen exporteren

Wanneer een script wordt uitgevoerd, bevindt het zich in zijn eigen proces en kunnen de variabelen die het gebruikt niet buiten dat proces worden gezien. Als je een variabele wilt delen met een ander script dat door je script wordt gestart, moet je die variabele exporteren. We laten je zien hoe je dit doet met twee scripts.

Sla eerst het volgende op met de bestandsnaam script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Dit creëert twee variabelen, first_var en second_var, en het kent enkele waarden toe. Het drukt deze af naar het terminalvenster, exporteert de variabelen en roept script_two.sh. Wanneer script_two.sh beëindigd, en de processtroom keert terug naar dit script, het drukt opnieuw de variabelen af ​​naar het terminalvenster. Vervolgens kunt u zien of ze zijn veranderd.

Het tweede script dat we zullen gebruiken is script_two.sh. Dit is het script dat script_one.shoproepen. Typ het volgende:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Dit tweede script drukt de waarden van de twee variabelen af, wijst er nieuwe waarden aan toe en drukt ze vervolgens opnieuw af.

Om deze scripts uit te voeren, moet u het volgende typen om ze uitvoerbaar te maken:

chmod +x script_one.sh
chmod +x script_two.sh

"chmod + x script_one.sh" en "chmod + x script_two.sh" in een terminalvenster.

En typ nu het volgende om te starten script_one.sh:

./script_one.sh

"./script_one.sh" in een terminalvenster.

Dit is wat de output ons vertelt:

  • script_one.sh drukt de waarden van de variabelen af, die alfa en bravo zijn.
  • script_two.sh drukt de waarden van de variabelen af ​​(alfa en bravo) zoals ze zijn ontvangen.
  • script_two.sh verandert ze in charlie en delta.
  • script_one.sh drukt de waarden van de variabelen af, die nog steeds alfa en bravo zijn.

Wat er in het tweede script gebeurt, blijft in het tweede script. Het is alsof er kopieën van de variabelen naar het tweede script worden gestuurd, maar ze worden verwijderd wanneer dat script wordt afgesloten. De oorspronkelijke variabelen in het eerste script worden niet gewijzigd door iets wat er met de kopieën ervan in het tweede script gebeurt.

Variabelen citeren

Het is je misschien opgevallen dat scripts naar variabelen verwijzen, ze tussen aanhalingstekens staan ". Hierdoor kunnen variabelen correct worden gerefereerd, zodat hun waarden worden gebruikt wanneer de regel wordt uitgevoerd in het script.

Als de waarde die u aan een variabele toewijst, spaties bevat, moeten deze tussen aanhalingstekens staan ​​wanneer u ze aan de variabele toewijst. Dit komt doordat Bash standaard een spatie als scheidingsteken gebruikt.

Hier is een voorbeeld:

site_name=How-To Geek

"site_name = How-To Geek" in een terminalvenster.

Bash ziet de spatie voor “Geek” als een indicatie dat er een nieuw commando wordt gestart. Het meldt dat er geen dergelijk commando is en verlaat de regel. echo laat ons zien dat de site_name variabele bevat niets – zelfs niet de ‘How-To’-tekst.

Probeer dat opnieuw met aanhalingstekens rond de waarde, zoals hieronder wordt weergegeven:

site_name="How-To Geek"

site_name = "How-To Geek" in een terminalvenster.

Deze keer wordt het herkend als een enkele waarde en correct toegewezen aan het site_name variabele.

echo is je vriend

Het kan even duren om te wennen aan het bevelen van vervanging, het citeren van variabelen en het onthouden wanneer het dollarteken moet worden toegevoegd.

Voordat u op Enter drukt en een regel met Bash-opdrachten uitvoert, probeert u het met echo voor. Op deze manier kunt u ervoor zorgen dat wat er gaat gebeuren, is wat u wilt. U kunt ook eventuele fouten in de syntaxis opvangen.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in