Hvordan jobbe med variabler i Bash

Variabler er avgjørende hvis du vil skrive skript og forstå hva koden du skal klippe og lime inn fra nettet vil gjøre med Linux-datamaskinen. Vi setter deg i gang!

Variabler 101

Variabler er navngitte symboler som representerer enten en streng eller numerisk verdi. Når du bruker dem i kommandoer og uttrykk, blir de behandlet som om du hadde skrevet inn verdien de har i stedet for navnet på variabelen.

For å lage en variabel, oppgir du bare et navn og en verdi for den. Variabelnavnene dine skal være beskrivende og minne deg om verdien de har. Et variabelnavn kan ikke starte med et tall, og det kan heller ikke inneholde mellomrom. Det kan imidlertid starte med en understreking. Bortsett fra det kan du bruke hvilken som helst blanding av store og små alfanumeriske tegn.

Eksempler

Her skal vi lage fem variabler. Formatet er å skrive inn navnet, likhetstegnet = og verdien. Merk at det ikke er et mellomrom før eller etter likhetstegnet. Å gi en variabel en verdi blir ofte referert til som å tilordne en verdi til variabelen.

Vi lager fire strengvariabler og en numerisk variabel, this_year:

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

Til se verdien holdt i en variabel, bruk echo-kommandoen. Du må gå foran variabelnavnet med et dollartegn $ hver gang du refererer til verdien den inneholder, som vist nedenfor:

echo $my_name
echo $my_boost
echo $this_year

De

La oss bruke alle variablene våre samtidig:

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

De

Verdiene til variablene erstatter navnene deres. Du kan også endre verdiene til variabler. For å tilordne en ny verdi til variabelen, my_boost, gjentar du bare det du gjorde da du tildelte dens første verdi, slik:

my_boost=Tequila

De

Hvis du kjører forrige kommando på nytt, får du nå et annet resultat:

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

Ekkoet

Så du kan bruke den samme kommandoen som refererer til de samme variablene og få forskjellige resultater hvis du endrer verdiene i variablene.

Vi skal snakke om å sitere variabler senere. Foreløpig er det noen ting å huske på:

En variabel i enkle anførselstegn « behandles som en bokstavelig streng, og ikke som en variabel.
Variabler i anførselstegn ” behandles som variabler.
For å få verdien holdt i en variabel, må du oppgi dollartegnet $.
En variabel uten dollartegnet $ gir bare navnet på variabelen.

Du kan også opprette en variabel som tar verdien fra en eksisterende variabel eller antall variabler. Følgende kommando definerer en ny variabel kalt drink_of_the_Year, og tildeler den de kombinerte verdiene for my_boost og this_year variablene:

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

Årets_drikk=

Slik bruker du variabler i skript

Skript ville være fullstendig forkledd uten variabler. Variabler gir fleksibiliteten som gjør et skript til en generell, snarere enn en spesifikk, løsning. For å illustrere forskjellen, her er et skript som teller filene i /dev-katalogen.

  Generer gjennomstreking, opp-ned, liten og bred tekst

Skriv dette inn i en tekstfil, og lagre den som fcnt.sh (for «filantall»):

#!/bin/bash

folder_to_count=/dev

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

echo $file_count files in $folder_to_count

Før du kan kjøre skriptet, må du gjøre det kjørbart, som vist nedenfor:

chmod +x fcnt.sh

Skriv inn følgende for å kjøre skriptet:

./fcnt.sh

Dette skriver ut antall filer i /dev-katalogen. Slik fungerer det:

En variabel kalt folder_to_count er definert, og den er satt til å holde strengen «/dev.»
En annen variabel, kalt file_count, er definert. Denne variabelen henter verdien fra en kommandoerstatning. Dette er kommandofrasen mellom parentesene $( ). Merk at det er et dollartegn $ før den første parentesen. Denne konstruksjonen $( ) evaluerer kommandoene innenfor parentesen, og returnerer deretter deres endelige verdi. I dette eksemplet er den verdien tilordnet til file_count-variabelen. Når det gjelder variabelen file_count, har den gitt en verdi som skal holdes; det er ikke opptatt av hvordan verdien ble oppnådd.
Kommandoen evaluert i kommandoerstatningen utfører en ls-filoppføring i katalogen i folder_to_count-variabelen, som er satt til «/dev.» Så, skriptet utfører kommandoen «ls /dev.»
Utdataene fra denne kommandoen overføres til wc-kommandoen. Alternativet -l (linjeantall) fører til at wc tell antall linjer i utdata fra ls-kommandoen. Siden hver fil er oppført på en egen linje, er dette antallet filer og underkataloger i «/dev»-katalogen. Denne verdien er tilordnet file_count-variabelen.
Den siste linjen bruker ekko for å sende ut resultatet.

Men dette fungerer bare for «/dev»-katalogen. Hvordan kan vi få skriptet til å fungere med en hvilken som helst katalog? Alt som trengs er en liten endring.

Slik bruker du kommandolinjeparametre i skript

Mange kommandoer, som ls og wc, tar kommandolinjeparametere. Disse gir informasjon til kommandoen, slik at den vet hva du vil at den skal gjøre. Hvis du vil at ls skal jobbe med hjemmekatalogen din og også for å vise skjulte filerkan du bruke følgende kommando, der tilde ~ og -a (alle)-alternativet er kommandolinjeparametere:

ls ~ -a

Skriptene våre kan godta kommandolinjeparametere. De refereres til som $1 for den første parameteren, $2 som den andre, og så videre, opp til $9 for den niende parameteren. (Faktisk er det en $0 også, men det er reservert for alltid å holde manuset.)

Du kan referere til kommandolinjeparametere i et skript akkurat som vanlige variabler. La oss endre skriptet vårt, som vist nedenfor, og lagre det med det nye navnet fcnt2.sh:

#!/bin/bash

folder_to_count=$1

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

echo $file_count files in $folder_to_count

Denne gangen blir folder_to_count-variabelen tildelt verdien til den første kommandolinjeparameteren, $1.

Resten av manuset fungerer akkurat som det gjorde før. I stedet for en spesifikk løsning, er skriptet ditt nå et generelt. Du kan bruke den på hvilken som helst katalog fordi den ikke er hardkodet til å fungere bare med «/dev.»

  Hvordan lage et dynamisk definert område i Excel

Slik gjør du skriptet kjørbart:

chmod +x fcnt2.sh

Prøv nå med noen få kataloger. Du kan gjøre «/dev» først for å sikre at du får samme resultat som før. Skriv inn følgende:

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

Du får samme resultat (207 filer) som før for «/dev»-katalogen. Dette er oppmuntrende, og du får katalogspesifikke resultater for hver av de andre kommandolinjeparametrene.

For å forkorte skriptet, kan du unnlate variabelen, folder_to_count, helt, og bare referere til $1 gjennom, som følger:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Arbeid med spesielle variabler

Vi nevnte $0, som alltid er satt til filnavnet til skriptet. Dette lar deg bruke skriptet til å gjøre ting som å skrive ut navnet på riktig måte, selv om det har fått nytt navn. Dette er nyttig i loggsituasjoner der du vil vite navnet på prosessen som la til en oppføring.

Følgende er de andre spesielle forhåndsinnstilte variablene:

$#: Hvor mange kommandolinjeparametere ble sendt til skriptet.
[email protected]: Alle kommandolinjeparametere sendt til skriptet.
$?: Utgangsstatusen til den siste prosessen som skal kjøres.
$$: Prosess-ID (PID) til gjeldende skript.
$USER: Brukernavnet til brukeren som kjører skriptet.
$HOSTNAME: Vertsnavnet til datamaskinen som kjører skriptet.
$SECONDS: Antall sekunder skriptet har kjørt i.
$RANDOM: Returnerer et tilfeldig tall.
$LINENO: Returnerer gjeldende linjenummer for skriptet.

Du vil se alle i ett manus, gjør du ikke? Du kan! Lagre følgende som en tekstfil kalt special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: [email protected]"
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"

Skriv inn følgende for å gjøre det kjørbart:

chmod +x special.sh

Nå kan du kjøre den med en haug med forskjellige kommandolinjeparametere, som vist nedenfor.

Miljøvariabler

Bash bruker miljøvariabler for å definere og registrere egenskapene til miljøet den oppretter når den startes. Disse holder informasjonen som Bash lett kan få tilgang til, for eksempel brukernavnet ditt, lokalitet, antall kommandoer historiefilen din kan inneholde, standardredigeringsprogrammet og mye mer.

For å se de aktive miljøvariablene i Bash-økten din, bruk denne kommandoen:

env | less

De

Hvis du blar gjennom listen, kan det hende du finner noen som kan være nyttige å referere til i skriptene dine.

Hvordan eksportere variabler

Når et skript kjører, er det i sin egen prosess, og variablene det bruker kan ikke sees utenfor denne prosessen. Hvis du vil dele en variabel med et annet skript som skriptet ditt starter, må du eksportere denne variabelen. Vi viser deg hvordan du gjør dette med to skript.

  Hvordan lage et kombinasjonsdiagram i Excel

Først lagrer du følgende med filnavnet 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"

Dette lager to variabler, first_var og second_var, og det tildeler noen verdier. Den skriver ut disse til terminalvinduet, eksporterer variablene og kaller script_two.sh. Når script_two.sh avsluttes, og prosessflyten går tilbake til dette skriptet, skriver det ut variablene til terminalvinduet igjen. Deretter kan du se om de endret seg.

Det andre skriptet vi skal bruke er script_two.sh. Dette er skriptet som script_one.sh kaller opp. Skriv inn følgende:

#!/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"

Dette andre skriptet skriver ut verdiene til de to variablene, tildeler nye verdier til dem og skriver dem deretter ut igjen.

For å kjøre disse skriptene må du skrive inn følgende for å gjøre dem kjørbare:

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

Og nå, skriv inn følgende for å starte script_one.sh:

./script_one.sh

Dette er hva utgangen forteller oss:

script_one.sh skriver ut verdiene til variablene, som er alfa og bravo.
script_two.sh skriver ut verdiene til variablene (alfa og bravo) slik den mottok dem.
script_two.sh endrer dem til charlie og delta.
script_one.sh skriver ut verdiene til variablene, som fortsatt er alfa og bravo.

Det som skjer i det andre manuset, blir i det andre manuset. Det er som om kopier av variablene sendes til det andre skriptet, men de blir forkastet når det skriptet avsluttes. De originale variablene i det første skriptet blir ikke endret av noe som skjer med kopiene av dem i det andre.

Hvordan sitere variabler

Du har kanskje lagt merke til at når skript refererer til variabler, står de i anførselstegn «. Dette gjør at variabler kan refereres riktig, så verdiene deres brukes når linjen kjøres i skriptet.

Hvis verdien du tilordner en variabel inkluderer mellomrom, må de stå i anførselstegn når du tilordner dem til variabelen. Dette er fordi Bash som standard bruker et mellomrom som skilletegn.

Her er et eksempel:

site_name=How-To Geek

Bash ser mellomrommet før «Geek» som en indikasjon på at en ny kommando starter. Den rapporterer at det ikke er noen slik kommando, og forlater linjen. echo viser oss at site_name-variabelen ikke inneholder noe – ikke engang «How-To»-teksten.

Prøv det igjen med anførselstegn rundt verdien, som vist nedenfor:

site_name="How-To Geek"

site_name=

Denne gangen gjenkjennes den som en enkelt verdi og tilordnes på riktig måte til variabelen site_name.

echo er din venn

Det kan ta litt tid å venne seg til å beordre substitusjon, sitere variabler og huske når du skal inkludere dollartegnet.

Før du trykker på Enter og utfører en linje med Bash-kommandoer, prøv den med ekko foran. På denne måten kan du sørge for at det som skal skje er det du ønsker. Du kan også fange eventuelle feil du kan ha gjort i syntaksen.