Eksporter $ somevariable = verdi
Filer er tilgjengelige i alle terminaler etter kilde; For dette formålet lagres miljøvariabler i bash -filer.
Anta at brukeren må bruke eller endre miljøvariabler ved hjelp av SED -kommandoen. I så fall kan ikke brukere bruke kommandoen som nevnt ovenfor for dette. Ulike funksjoner og metoder må brukes til SED -kommandoen. I denne artikkelen vil vi se noen slike metoder, som er som følger.
I Linux-kommandolinjen er SED et potent prosesseringsverktøy. Ved hjelp av kompakte sed one-liners gjør brukere ofte tekstutskiftning som er ganske praktisk. Når brukere erstatter SED med skallvariabler, har den også noen ulemper.
Hvordan bruke miljøvariabler i SED -kommandoen
La oss ha et eksempel, her har vi en fil som heter Test.tekst.
kattest.tekst
Current_time = # Fyll
Gjeldende dato og tid
Java_home = # fyll
Java_Home Path
Vi vil skrive et skallskript for å befolke Java_Home -banen og nåværende tid i ovennevnte gjeldende system. Denne prosessen er enkel, men det er noen problemer i den som er mulig. Her skal vi skrive et manus ved hjelp av Gnu Sed.
Som vi har nevnt ovenfor, her vil vi erstatte Java_Home -banen og nåværende tid. For dette vil vi først fylle den nåværende tiden på de rette stedene her. Vi kan bruke datakommandoen for å få gjeldende tid.
katteløsning.sh
#!/bin/sh
My_date = $ (dato)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'test.tekst
Manuset skrevet over er ikke så vanskelig å forstå. Ved først å erstatte kommandoen i en variabel my_date, få tid og nåværende dato og lagre den.
Etter å ha fått dataene ved hjelp av SED -substitusjon, fyller brukeren dem i filen. Vi har brukt -i -alternativet til GNU SED -kommandoen for å utføre redigering på stedet.
Nå skal vi sjekke og utføre skriptet vårt.
$ ./løsning.sh
$ kattest.tekst
Current_time = $ my_date
Java_home = # Fyll Java_Home -banen
Vi ser i utgangen at linjen med “Current_time =” er erstattet. Imidlertid er den bokstavelige "$ my_date" fylt ut i stedet for tid og nåværende dato.
Årsaken til at skallvariabler ikke utvides innenfor enkelt sitater, er at vi brukte enkelt sitater under SED -kommandoen.
Dobbelt anførselstegn brukes i SED -kommandoen for å tillate hurtigfikseskallvariabel utvidelse.
$ katteløsning.sh
#!/bin/sh
My_date = $ (dato)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.tekst
Nå vil vi teste løsningen.SH -manus igjen.
$ ./løsning.sh
$ kattest.tekst
Current_time = ons 27. januar 10:02:05 PM CET 2021
Java_home = # Fyll Java_Home -banen
Etter å ha fylt tid og dato på de rette stedene, er Java_Home -banen fylt.
Vi ser hvilken avgrenser vi bør bruke ved å legge til en annen SED -kommando til løsningen vår.SH -manus.
$ katteløsning.sh
..
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.tekst
sed -i -r "s/^(java_home =).*/\ 1 $ Java_Home/"Test.tekst
Sjekker skriptet ovenfor.
$ ./løsning.sh
SED: -E EXPORT #1, CHAR 24: Ukjent alternativ til 'S'
Vi ser at den nye SED -kommandoen som er lagt til, fungerer ikke. Hvis vi tester det for andre gang, ser vi at bare variabelen er annerledes, men å jobbe er den samme som SED -kommandoen. For å løse dette, bør vi ta følgende tiltak:
Avgrenseren eksisterer ikke i variabelen
For å vite dette godt, må brukere først forstå hva miljøvariabelen $ Java_Home inneholder.
$ ekko $ java_home
/usr/lib/jvm/standard
Vi kan se at de skallvariablene utvides innenfor dobbeltkjøres. Så vår andre SED -kommando kommer etter variabel utvidelse.
sed -i -r "s/^(java_home =).*/\ 1/usr/lib/jvm/standard/"test.tekst
Slashene (/) i variabelenes verdi forstyrrer 'S' -kommandoen (S/mønster/erstatning/), og det er grunnen til at ovennevnte SED -kommando ikke fungerer. På denne måten kan vi velge andre tegn som avgrensere av 'S' -kommandoen.
Brukere kan endre den andre SED -kommandoen for å løse dette ved å bruke '#' som avgrenseren av S -kommandoen.
sed -i -r "s#^(java_home =).*#\ 1 $ java_home#"Test.tekst
Nå tester vi skriptet ovenfor.
$ ./løsning.sh
$ kattest.tekst
Current_time = ons 27. januar 10:36:57 PM CET 2021
Java_home =/usr/lib/jvm/standard
Løsning 2
løsning.SH fungerer i de fleste tilfeller. Vi ser også at '#' i filnavn er et gyldig tegn på de fleste *nix filsystemer. Hvis vi utfører skriptet vårt til java_home på et system satt til /opt /#jvm#, mislykkes brukerens skript igjen. Vi vil gjøre følgende arbeid for at skriptet vårt skal fungere i alle tilfeller
Brukere kan bruke bash -substitusjon for å unnslippe avgrenseren. For eksempel kan brukeren slippe unna alle '#' tegn i variabel $ var.
$ Var = "foo#bar#bla"
$ ekko "$ var //#/\\#"
foo \ #bar \ #blah
Nå vil vi bruke skriptet vårt her.
$ katteløsning.sh
#!/bin/sh
My_date = $ (dato)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"test.tekst
sed -i -r "s#^(java_home =).*#\ 1 $ java_home //#/\\##"Test.tekst
Vi vil teste ved å utføre skriptet vårt med den falske Java_Home -variabelen for å se om det fungerer som forventet.
$ Java_home =/opt/#/:/@/-/_/$/jvm ./løsning.sh
$ kattest.tekst
Current_time = Thu 28. januar 11:23:07 AM CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm
Vi konkluderer med at skriptet vårt fungerer selv om vi har mange spesialtegn i vår java_home -variabel.
Konklusjon
I denne artikkelen så vi hvordan vi bruker miljøvariabler med SED -kommandoen. De gjør også mange feil som de forårsaker, som vi også har nevnt i denne artikkelen og deres oppreisning. Vi håper at du fra denne artikkelen får den fullstendige kunnskapen du trenger.