Sådan arbejder du med variabler i Bash

Variabler er afgørende, hvis du vil skrive scripts og forstå, hvad den kode, du er ved at klippe og indsætte fra nettet, vil gøre på din Linux-computer. Vi får dig i gang!

Variabler 101

Variabler er navngivne symboler, der repræsenterer enten en streng eller numerisk værdi. Når du bruger dem i kommandoer og udtryk, behandles de, som om du havde skrevet den værdi, de har, i stedet for navnet på variablen.

For at oprette en variabel skal du blot angive et navn og en værdi for den. Dine variabelnavne skal være beskrivende og minde dig om den værdi, de har. Et variabelnavn kan ikke starte med et tal, og det kan heller ikke indeholde mellemrum. Det kan dog starte med en understregning. Ud over det kan du bruge en hvilken som helst blanding af store og små alfanumeriske tegn.

Eksempler

Her vil vi oprette fem variabler. Formatet er at skrive navnet, lighedstegnet = og værdien. Bemærk, at der ikke er et mellemrum før eller efter lighedstegnet. At give en variabel en værdi omtales ofte som at tildele en værdi til variablen.

Vi opretter fire strengvariabler og en numerisk variabel, this_year:

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

Til se værdien holdt i en variabel, brug echo-kommandoen. Du skal foran variabelnavnet med et dollartegn $, når du refererer til den værdi, den indeholder, som vist nedenfor:

echo $my_name
echo $my_boost
echo $this_year

Det

Lad os bruge alle vores variabler på én gang:

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

Det

Værdierne af variablerne erstatter deres navne. Du kan også ændre værdierne for variabler. For at tildele en ny værdi til variablen, my_boost, gentager du bare, hvad du gjorde, da du tildelte dens første værdi, sådan:

my_boost=Tequila

Det

Hvis du kører den forrige kommando igen, får du nu et andet resultat:

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

Ekkoet

Så du kan bruge den samme kommando, der refererer til de samme variabler og få forskellige resultater, hvis du ændrer værdierne i variablerne.

Vi taler om at citere variabler senere. Indtil videre er her nogle ting at huske:

En variabel i enkelte anførselstegn ‘ behandles som en bogstavelig streng og ikke som en variabel.
Variabler i anførselstegn ” behandles som variable.
For at få værdien fastholdt i en variabel, skal du angive dollartegnet $.
En variabel uden dollartegnet $ angiver kun navnet på variablen.

Du kan også oprette en variabel, der tager sin værdi fra en eksisterende variabel eller et antal variabler. Følgende kommando definerer en ny variabel kaldet drink_of_the_Year og tildeler den de kombinerede værdier af my_boost og this_year variablerne:

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

Årets_drik=

Sådan bruges variabler i scripts

Scripts ville være fuldstændigt forringet uden variabler. Variabler giver den fleksibilitet, der gør et script til en generel, snarere end en specifik, løsning. For at illustrere forskellen er her et script, der tæller filerne i mappen /dev.

  Sådan starter du en blog ved hjælp af Google Blogger

Indtast dette i en tekstfil, og gem det derefter som fcnt.sh (for “filantal”):

#!/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 køre scriptet, skal du gøre det eksekverbart, som vist nedenfor:

chmod +x fcnt.sh

Skriv følgende for at køre scriptet:

./fcnt.sh

Dette udskriver antallet af filer i mappen /dev. Sådan fungerer det:

En variabel kaldet folder_to_count er defineret, og den er indstillet til at holde strengen “/dev.”
En anden variabel, kaldet file_count, er defineret. Denne variabel tager sin værdi fra en kommandosubstitution. Dette er kommandosætningen mellem parenteserne $( ). Bemærk, at der er et dollartegn $ før den første parentes. Denne konstruktion $( ) evaluerer kommandoerne inden for parentes og returnerer derefter deres endelige værdi. I dette eksempel er denne værdi tildelt til variabelen file_count. Hvad angår variabelen file_count, har den givet en værdi, der skal holdes; det er ikke bekymret med, hvordan værdien blev opnået.
Kommandoen, der evalueres i kommandoerstatningen, udfører en ls-filliste på mappen i variablen folder_to_count, som er sat til “/dev.” Så scriptet udfører kommandoen “ls /dev.”
Outputtet fra denne kommando overføres til wc-kommandoen. Indstillingen -l (linjeantal) får wc til tæl antallet af linjer i outputtet fra ls-kommandoen. Da hver fil er opført på en separat linje, er dette antallet af filer og undermapper i “/dev”-mappen. Denne værdi er tildelt til variabelen file_count.
Den sidste linje bruger ekko til at udlæse resultatet.

Men dette virker kun for “/dev”-mappen. Hvordan kan vi få scriptet til at fungere med enhver mappe? Det eneste, der skal til, er en lille ændring.

Sådan bruges kommandolinjeparametre i scripts

Mange kommandoer, såsom ls og wc, tager kommandolinjeparametre. Disse giver information til kommandoen, så den ved, hvad du vil have den til at gøre. Hvis du vil have ls til at arbejde på din hjemmemappe og også for at vise skjulte filer, kan du bruge følgende kommando, hvor tilde ~ og -a (alle) muligheden er kommandolinjeparametre:

ls ~ -a

Vores scripts kan acceptere kommandolinjeparametre. De refereres til som $1 for den første parameter, $2 som den anden, og så videre, op til $9 for den niende parameter. (Faktisk er der også en $0, men det er reserveret til altid at holde scriptet.)

Du kan referere til kommandolinjeparametre i et script på samme måde som almindelige variabler. Lad os ændre vores script, som vist nedenfor, og gemme det med det nye navn 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 gang tildeles variablen folder_to_count værdien af ​​den første kommandolinjeparameter, $1.

Resten af ​​scriptet fungerer præcis som det gjorde før. I stedet for en specifik løsning er dit script nu et generelt. Du kan bruge det på enhver mappe, fordi det ikke er hårdkodet til kun at fungere med “/dev.”

  Sådan sletter du dine personlige oplysninger fra People-Finder-websteder

Sådan gør du scriptet eksekverbart:

chmod +x fcnt2.sh

Prøv det nu med et par mapper. Du kan gøre “/dev” først for at sikre, at du får det samme resultat som før. Indtast følgende:

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

Du får det samme resultat (207 filer) som før for “/dev”-mappen. Dette er opmuntrende, og du får mappespecifikke resultater for hver af de andre kommandolinjeparametre.

For at forkorte scriptet kan du helt undvære variablen folder_to_count og blot henvise til $1 hele vejen igennem, som følger:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Arbejde med specielle variabler

Vi nævnte $0, som altid er indstillet til scriptets filnavn. Dette giver dig mulighed for at bruge scriptet til at gøre ting som at udskrive dets navn korrekt, selvom det er omdøbt. Dette er nyttigt i logningssituationer, hvor du vil vide navnet på den proces, der tilføjede en post.

Følgende er de andre specielle forudindstillede variabler:

$#: Hvor mange kommandolinjeparametre blev sendt til scriptet.
[email protected]: Alle kommandolinjeparametrene videregivet til scriptet.
$?: Afslutningsstatus for den sidste proces, der skal køres.
$$: Process ID (PID) for det aktuelle script.
$USER: Brugernavnet på den bruger, der udfører scriptet.
$HOSTNAME: Værtsnavnet på den computer, der kører scriptet.
$SECONDS: Antallet af sekunder scriptet har kørt i.
$RANDOM: Returnerer et tilfældigt tal.
$LINENO: Returnerer det aktuelle linjenummer for scriptet.

Du vil gerne se dem alle i ét manuskript, ikke? Du kan! Gem følgende som en tekstfil kaldet 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"

Indtast følgende for at gøre det eksekverbart:

chmod +x special.sh

Nu kan du køre det med en masse forskellige kommandolinjeparametre, som vist nedenfor.

miljøvariabler

Bash bruger miljøvariabler til at definere og registrere egenskaberne for det miljø, det opretter, når det lanceres. Disse gemmer oplysninger, som Bash let kan få adgang til, såsom dit brugernavn, lokalitet, antallet af kommandoer, din historiefil kan indeholde, din standardeditor og meget mere.

For at se de aktive miljøvariabler i din Bash-session skal du bruge denne kommando:

env | less

Det

Hvis du ruller gennem listen, vil du muligvis finde nogle, som ville være nyttige at referere til i dine scripts.

Sådan eksporteres variabler

Når et script kører, er det i sin egen proces, og de variabler, det bruger, kan ikke ses uden for denne proces. Hvis du vil dele en variabel med et andet script, som dit script starter, skal du eksportere denne variabel. Vi viser dig, hvordan du gør det med to scripts.

  Hvad er et Kanban-bræt, og hvordan bruger du det?

Gem først 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 skaber to variabler, first_var og second_var, og det tildeler nogle værdier. Det udskriver disse til terminalvinduet, eksporterer variablerne og kalder script_two.sh. Når script_two.sh afsluttes, og procesflowet vender tilbage til dette script, udskriver det igen variablerne til terminalvinduet. Så kan du se, om de har ændret sig.

Det andet script vi vil bruge er script_two.sh. Dette er scriptet, som script_one.sh kalder. Indtast 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 andet script udskriver værdierne for de to variable, tildeler dem nye værdier og udskriver dem derefter igen.

For at køre disse scripts skal du skrive følgende for at gøre dem eksekverbare:

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

Og skriv nu følgende for at starte script_one.sh:

./script_one.sh

Dette er, hvad outputtet fortæller os:

script_one.sh udskriver værdierne af variablerne, som er alfa og bravo.
script_two.sh udskriver værdierne af variablerne (alfa og bravo), som det modtog dem.
script_two.sh ændrer dem til charlie og delta.
script_one.sh udskriver værdierne af variablerne, som stadig er alfa og bravo.

Hvad der sker i det andet manuskript, bliver i det andet manuskript. Det er som om, at kopier af variablerne sendes til det andet script, men de kasseres, når det script afsluttes. De originale variabler i det første script ændres ikke af noget, der sker med kopierne af dem i det andet.

Sådan citerer du variabler

Du har måske bemærket, at når scripts refererer til variabler, er de i anførselstegn “. Dette gør det muligt at referere til variabler korrekt, så deres værdier bruges, når linjen udføres i scriptet.

Hvis den værdi, du tildeler en variabel, indeholder mellemrum, skal de stå i anførselstegn, når du tildeler dem til variablen. Dette skyldes, at Bash som standard bruger et mellemrum som afgrænsning.

Her er et eksempel:

site_name=How-To Geek

Bash ser mellemrummet før “Geek” som en indikation af, at en ny kommando starter. Den rapporterer, at der ikke er en sådan kommando, og forlader linjen. echo viser os, at variabelen site_name ikke indeholder noget – ikke engang “How-To”-teksten.

Prøv det igen med anførselstegn omkring værdien, som vist nedenfor:

site_name="How-To Geek"

site_name=

Denne gang genkendes den som en enkelt værdi og tildeles korrekt til variabelen site_name.

echo er din ven

Det kan tage lidt tid at vænne sig til at beordre substitution, citere variabler og huske, hvornår dollartegnet skal inkluderes.

Før du trykker på Enter og udfører en linje med Bash-kommandoer, så prøv det med ekko foran. På denne måde kan du sikre dig, at det, der skal ske, er det, du ønsker. Du kan også fange eventuelle fejl, du måtte have lavet i syntaksen.