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
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
Laten we al onze variabelen tegelijk gebruiken:
echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"
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
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"
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.
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
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
Typ het volgende om het script uit te voeren:
./fcnt.sh
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 defile_count
variabele. Zo ver als defile_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 hetfolder_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 oorzakenwc
om het aantal regels in de uitvoer van dels
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 defile_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
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
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
Nu kunt u het uitvoeren met een aantal verschillende opdrachtregelparameters, zoals hieronder wordt weergegeven.
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
Als u door de lijst bladert, vindt u er wellicht enkele die handig zijn om in uw scripts naar te verwijzen.
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.sh
oproepen. 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
En typ nu het volgende om te starten script_one.sh
:
./script_one.sh
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
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"
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.